Java 泛型问题 ArrayList arrI=new ArrayList(); ArrayList arrO=arrI;//警告 /*可以添加字符串,因为它是对象的ArrayList 但是JVM会知道真正的类型,arrO是 整数。。。 */ 加上(“你好”); /*如何在ArrayList中获取字符串?? 即使编译器告诉我我会得到一个整数! */ System.out.println(arrI.get(0));
任何人都可以解释这里发生了什么?因为运行时不存在泛型。实际上,这意味着您的arraylist可以携带任何类型的对象。泛型只是程序员的一种习惯,它允许编译器验证某些代码的正确性。JVM不知道真正的类型,因为泛型是通过类型擦除实现的 就字节码(以及运行时行为)而言,您的代码相当于:Java 泛型问题 ArrayList arrI=new ArrayList(); ArrayList arrO=arrI;//警告 /*可以添加字符串,因为它是对象的ArrayList 但是JVM会知道真正的类型,arrO是 整数。。。 */ 加上(“你好”); /*如何在ArrayList中获取字符串?? 即使编译器告诉我我会得到一个整数! */ System.out.println(arrI.get(0));,java,generics,Java,Generics,任何人都可以解释这里发生了什么?因为运行时不存在泛型。实际上,这意味着您的arraylist可以携带任何类型的对象。泛型只是程序员的一种习惯,它允许编译器验证某些代码的正确性。JVM不知道真正的类型,因为泛型是通过类型擦除实现的 就字节码(以及运行时行为)而言,您的代码相当于: ArrayList<Integer> arrI = new ArrayList<Integer>(); ArrayList arrO = arrI; // Warning /* It is ok
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));
在运行时,泛型信息丢失。它只防止编译时出错
如果您尝试arr1.add(“Hello”);它将在编译时抛出一个错误,因为arr1已声明为ArrayList,但arr0可以在运行时的任何时间点被分配为arr1—它必须允许 你是否阅读并理解了警告?警告告诉您,通过编写此代码,您将绕过arrI的所有编译时类型检查。@DJClayworth ok,但最后一行实际上是wierd
ArrayList arrI = new ArrayList();
ArrayList arrO = arrI;
arrO.add("Hello");
System.out.println(arrI.get(0));