Javaジェネリックは不変であるため、そのようなキャストを行うことは不可能です:
List<Object> li = (List<Object>)new ArrayList<Integer>();
しかし、次の 4 行目のコードでは、 from からList<Integer>
toList<T>
にキャストできます。ここでT
は、任意の型を指定できます。なぜそのタイプのキャストが許可されているのですか?
チェックされていないキャストに関する警告が生成されることは知っていますが、ポイントは、このキャストはパラメーター化されたメソッド内で可能ですが、通常のコードでは不可能であるということです。ジェネリックは不変であることに注意してください。なぜそれが許可されているのですか? 通常のコードでは、意味をなさないものList<Integer>
にしかキャストできず、他のキャストは違法です。List<Integer>
それでは、4行目のようなキャストを許可するポイントは何ですか?
ジェネリック型はコンパイル時に削除され、 で終わることは知っていますが、これらの型を削除する前に、誰かが Integer を渡す場合にのみ受け入れられない限り、このキャストを許可しないList xlist = (List)list
ことは明らかです。el
.
class Test {
public static <T> void t(List<Integer> list, T el) {
List<T> xlist = (List<T>)list; //OK
xlist.add(el);
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
t(list, "a");
t(list, "b");
//prints [a, b] even if List type is Integer
System.out.println(list);
}
}