ArrayList<Integer> arrI = new ArrayList<Integer>();
ArrayList arrO = arrI; // Warning
/* It is ok to add a String as it is an ArrayList of Objects
but the JVM will know the real type, arrO is an arrayList of
Integer...
*/
arrO.add("Hello");
/* How I can get a String in an ArrayList<Integer> ??
Even if the compiler told me that I will get an Integer!
*/
System.out.println(arrI.get(0));
任何人都可以解释这里发生了什么?
答案 0 :(得分:3)
由于type erasure
泛型在运行时不存在。在实践中,这意味着你的arraylist可以携带任何类型的对象。泛型只是程序员的一种惯例,它允许编译器验证您的一些代码的正确性。
答案 1 :(得分:3)
JVM不知道真实类型,因为泛型是通过类型擦除实现的。
就字节码(以及运行时行为)而言,您的代码等同于:
ArrayList arrI = new ArrayList();
ArrayList arrO = arrI;
arrO.add("Hello");
System.out.println(arrI.get(0));
答案 2 :(得分:2)
在运行时,泛型信息会丢失。它只能在编译时防止错误。
如果您尝试arr1.add(“Hello”);它会在编译时抛出一个错误,因为arr1已被声明为ArrayList,但是arr0可以在运行时的任何一点分配arr1 - 它必须允许它。