私は行く宣言、インターフェース、クラスを見てきましたTYPE<CLASS>
これはどういう意味/意味ですか?
証拠がなければ、あなたはJavaのジェネリックスのサポートについて話していると思います...
ジェネリックスを使用すると、型を抽象化できます
Java 5以前は、特定の状況ごとにコーディングしなくても、複数の異なるタイプのオブジェクトをサポートできるクラスを提供することは困難でした。そのため、Object
代わりに渡すのが一般的でした。
これにより、実行時に多くの難しい選択を行うことになります。たとえば、特定のオブジェクトを使用可能なタイプにキャストできるかどうかを確認するために、実行時チェックを実行する必要があります。
List myIntList = new LinkedList(); // 1
myIntList.add(new Integer(0)); // 2
Integer x = (Integer) myIntList.iterator().next(); // 3
さて、これはかなり明白ですが、もしあなたがただ渡されたならList
、あなたはリストのすべての要素が正しいかどうかをチェックしなければならないでしょう...
しかし今、私たちはこれを行うことができます...
List<Integer> myIntList = new LinkedList<Integer>(); // 1'
myIntList.add(new Integer(0)); // 2'
Integer x = myIntList.iterator().next(); // 3'
これは基本的に「このリストには整数型のオブジェクトのみが含まれている」という契約です。
ジェネリックスを使用すると、複数の異なるデータ型またはデータ型のファミリーを処理できる単一のクラスを構築できます(つまり、特定の親型から拡張する必要があるようにパラメーターを制約します)。
Iterator<? extends Number> itNum;
基本的に、これには、から継承するオブジェクトが含まれ、、、、、..Number
がInteger
含まれます。Long
Double
Float
多くの場合、メソッドとクラスの減速では、次のようなものが表示されます...
public class MyGenericClass<T> {...}
また
public class MyGenericClass<T extends MyBaseObject> {...}
これによりT
、たとえば、具体的なオブジェクトタイプであるかのように参照できます。
public class MyGenericClass<T extends MyBaseObject> {
private T value;
public MyGenericClass(T value) {
this.value = value;
}
}
これにより、コンパイラー(およびJVM)は、基本的にマーカーをコンサートタイプに「置き換える」ことができますT
(わかりました、それよりも少し複雑ですが、それは魔法です)...
これにより、次のようなことができます...
... new MyGenericClass<MySuperObject>(new MySuperObject());
... new MyGenericClass<MySuperSuperObject>(new MySuperSuperObject());
そして、それは私が指定したオブジェクトのタイプのみを受け入れることを知っています...
最初の段落のリンクを読んでください、私ができるよりももっと正義を行うことができると確信しています;)
public class Grid<E> {
これが、Javaでジェネリッククラスを定義する方法です。Grid
はクラスでE
あり、正式な型パラメータです。
あなたがそれについて学ぶことに本当に興味があるなら、あなたはここで非常に良いリファレンスを見つけるでしょう-JavaGenericsFAQ-よくある質問
つまり、ジェネリック型はここで確認してください。簡単な例は
List<String>
Map<Integer, String>
あなたが何を見ているのかを正確に見ずに、あなたが何を求めているのかは不明確です。しかし、JavaでGenericsが表示されている可能性があります。詳細はこちら
アイデアは基本的にJavaでより強力な型安全性を作ることです。したがって、List<Integer> intList
meansのような宣言にintList
は整数が含まれます。そして、たとえば文字列を入れようとすると、コンパイルエラーがスローされます。