我有这个代码
ArrayList<Integer>arr = new ArrayList<>();
arr.add(1);
arr.add(2);
List l = arr;
l.add("12");// should't this throw an runtime exception? Point1
l.add("123");
System.out.println(l.size());
ArrayList<String>arr1 =(ArrayList<String>) l;// should't this throw an runtime execptions? Point2
arr1.add("12"); //Point 3
System.out.println(arr1.size());
我正在尝试泛型代码,我很惊讶地看到一些结果。我有这个具体问题。
我有一个整数数组列表。我将它分配给列表 l,它没有任何泛型类型。然后我将一个字符串添加到该列表中。这不应该引发运行时异常吗? l list仍然是一个整数数组列表吗?
然后我将 l 转换为字符串的数组列表?这不应该引发运行时异常吗?我不是有效地将整数数组列表转换为字符串数组列表吗?
在本例中,第 3 点,我向 arr1 添加一个字符串,即使它应该是字符串的数组列表?
我觉得这三个问题都是相关的?谁能向我解释我做错了什么?
最佳答案
泛型在编译时强制执行,以便编译器可以进行类型检查。然而,通过 type erasure ,关于类型的信息实际上在运行时并没有被使用。相反,集合都只包含Object
。我相信这样做最初是为了保留与以前没有泛型支持的 Java 版本的字节码兼容性。
但是,您应该收到一些有关使用原始类型的警告。
关于java - 为什么这个泛型代码没有运行时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25978671/