Javaジェネリックに関するこのチュートリアルを必ずお読みください:http :
//docs.oracle.com/javase/tutorial/java/generics/
一言で言えば:
多くのJavaクラスおよび型(ジェネリッククラスまたはジェネリック型と呼ばれる)、通常はコレクションには、 in (任意に選択された名前、他のクラスの名前など)などのいわゆる型パラメーターがあります。E
ArrayList<E>
E
T
public class ArrayList<E> extends ... {
public E get(int index) { ... }
public boolean add(E element) { ... }
// other methods...
}
ここで、そのようなクラスのインスタンスを作成するときは、たとえば、型パラメーターの具体的な値を定義しますString
(E
通常、必要な型に評価できます)。
ArrayList<String> stringList = new ArrayList<String>();
これ以降、すべてのE
sが変数に「置き換え」られるString
ため、stringList
変数に文字列のみを追加して、そこから文字列のみを取得できます。コンパイラは、別のタイプのオブジェクトを誤って追加していないことを確認します。
stringList.add(Integer.valueOf(1));
// compile error - cannot add Integer to ArrayList of Strings
ただし、ジェネリックがJava 5に追加されたため、下位互換性のためにジェネリックなしでコードを記述できます。だからあなたは書くことができます:
ArrayList list = new ArrayList();
ただし、タイプチェックの利点はすべて失われます。E
メソッドシグネチャのsは単純にObject
sになります。
list.add(Integer.valueOf(42)); // adding an Integer
list.add("aaa"); // adding a String
Object something = list.get(0); // unknown type of returned object, need to cast
Integer i0 = (Integer) something; // this unsafe cast works...
Integer i1 = (Integer) list.get(1); // but this fails with a ClassCastException
// because you cannot cast a String to Integer
生の型(つまり、型パラメーターが省略されたジェネリック型)を使用することは安全ではないという事実が、警告の理由です。ただの代わりに、またはまたはあなたのタイプが何であれArrayList
を使用してください。ArrayList<String>
ArrayList<Integer>
items