java - 为什么这个泛型代码没有运行时错误?

标签 java generics

我有这个代码

    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/

相关文章:

swift - associatedType 的值可以是协议(protocol)吗?

java - 在 Java 中运行计划任务

java - 我怎样才能平滑我的地形生成器?

java - 如何将 List<实现接口(interface)的对象> 传递给方法?

c++ - 如何从 C++ 模板中的方法类型推断类类型?

java - 使用 Optional.map.orElse 返回不同的通用类型

java - Java 12 无法访问 org.openqa.selenium.chrome.ChromeDriver 类型

java - Android Realm,通过子属性查询对象

java - 安装 h2o/使用 Java?

C# 使方法更通用以供重用,有没有更好的方法?