泛型类型问题

时间:2011-11-14 17:49:03

标签: java generics

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));

任何人都可以解释这里发生了什么?

3 个答案:

答案 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 - 它必须允许它。