ジェネリックを使用することで、コンパイル中に可能性を検出します。例えば、
List<String> list = new ArrayList<String>();
//list.add(new Integer(45)); This will cause compilation error.
list.add("car");
list.add("bus");
list.add("bike");
String vehicle = list.get(0); //compiler-generated cast
Java 1.5 より前のジェネリックの代わりに生の型を使用する場合は、明示的なキャストが必要です。例えば、
List list2 = new ArrayList();
list.add("car");
list.add("bus");
list.add("bike");
String vehicle = (String)list.get(0); //explicit casting is necessary
ただし、ジェネリックでは、型の消去が発生します。つまり、実行時に型情報が失われます。そうである場合、JVM は実行時に取得するオブジェクトの種類を、それが文字列オブジェクトであるか人物オブジェクトであるか (上記のコンパイラで生成されたキャスト) にどのように認識しますか。ただし、これはジェネリックで有効であり、実行時エラーを引き起こす可能性があります。
List<Object> test = new ArrayList<Object>();
test.add("hello");
test.add(new Integer(34));
最後に、Joshua Bloch が 115 ページ (item 23、有効な Java) で言及している
Set<Object>
のは、任意の型のオブジェクトを含むことができるセットを表すパラメーター化された型で
Set<?>
あり、未知の型のオブジェクトのみを含むことができるセットを表すワイルドカード型でSet
あり、ジェネリック型システムをオプトアウトする raw 型。
彼の上記の発言の意味は理解できます。いくつかの説明が役立ちます