Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型问题 ArrayList arrI=new ArrayList(); ArrayList arrO=arrI;//警告 /*可以添加字符串,因为它是对象的ArrayList 但是JVM会知道真正的类型,arrO是 整数。。。 */ 加上(“你好”); /*如何在ArrayList中获取字符串?? 即使编译器告诉我我会得到一个整数! */ System.out.println(arrI.get(0));_Java_Generics - Fatal编程技术网

Java 泛型问题 ArrayList arrI=new ArrayList(); ArrayList arrO=arrI;//警告 /*可以添加字符串,因为它是对象的ArrayList 但是JVM会知道真正的类型,arrO是 整数。。。 */ 加上(“你好”); /*如何在ArrayList中获取字符串?? 即使编译器告诉我我会得到一个整数! */ System.out.println(arrI.get(0));

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可以携带任何类型的对象。泛型只是程序员的一种习惯,它允许编译器验证某些代码的正确性。

JVM不知道真正的类型,因为泛型是通过类型擦除实现的

就字节码(以及运行时行为)而言,您的代码相当于:

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