Java のジェネリックはクラスでは機能するのに、プリミティブ型では機能しないのはなぜですか?
たとえば、これは正常に動作します:
List<Integer> foo = new ArrayList<Integer>();
しかし、これは許可されていません:
List<int> bar = new ArrayList<int>();
ベストアンサー1
Java のジェネリックは完全にコンパイル時の構造です。コンパイラはすべてのジェネリックの使用を適切な型へのキャストに変換します。これは、以前の JVM ランタイムとの下位互換性を維持するためです。
これ:
List<ClassA> list = new ArrayList<ClassA>();
list.add(new ClassA());
ClassA a = list.get(0);
次のように変換されます (大まかに):
List list = new ArrayList();
list.add(new ClassA());
ClassA a = (ClassA)list.get(0);
したがって、ジェネリックとして使用されるものはすべて Object に変換可能である必要があります (この例ではget(0)
を返しますObject
)。プリミティブ型は変換できません。したがって、ジェネリックでは使用できません。