java - 为什么在将对象类型更改为泛型后,我仍然能够将任何对象添加到具有原始类型引用类型的列表中?

标签 java generics reference raw-types object-type

我使用 List 的原始引用类型和 ArrayList 的原始对象类型声明并初始化了 myList。然后,我将 myList 重新引用到一个新的通用 Long ArrayList。我认为向此列表添加除 Long 以外的任何内容都会导致错误。

List myList = new ArrayList();
myList = new ArrayList<Long>();
myList.add(3.4d);
myList.add(4.0f);
myList.add("weird");
myList.add('w');
System.out.println(myList);

但是,它运行时没有错误或异常。这怎么合法?

最佳答案

如果你将其声明为 List<Long>您将获得静态编译时类型检查。进行类型删除时,JVM 在运行时对这些类型一无所知。

List<Long> myList = new ArrayList<>();
myList.add("foo");

会出现编译错误:

public void breakGeneric(List list) {
    list.add("foo");
}
....
List<Long> myList = new ArrayList<>();
breakGeneric(myList);

无论类型是什么,都会将“foo”添加到列表中。大多数 IDE 都会因为失去通用类型而感到厌烦。

在新语句中具有类型 new ArrayList<Long>()仅当您将该语句链接起来时才会产生效果,即 new ArrayList<Long>().add("foo") 。这是泛型类型 onlynew 中的唯一方法。语句会导致编译问题。

关于java - 为什么在将对象类型更改为泛型后,我仍然能够将任何对象添加到具有原始类型引用类型的列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59571392/

相关文章:

java - Tomcat:严重:加载 WebappClassLoader 时出错

java - 获取用户输入的前景色并将其应用到 JTextArea?为什么字符串前景色不起作用?

c# - 在编译时用值创建 List<int>

Java类组织

java - 访问 "Memory"中的字节元素

c#-4.0 - 对通用 ContinueWith 的模糊调用

java - 嵌套 Java 泛型类型

c++ - 类型 ** 的包装器的数组订阅运算符的返回类型是 *&?

XML Schema key/keyref - 如何使用它们?

java - Jface KeyListener 未激活