好吧,这个站点上有很多关于 Java 中的原始类型和泛型的问题。甚至关于为什么下一行代码会出现警告的问题:
List<String> list = new ArrayList();
并回答了很多次,因为 ArrayList() 是原始类型,因此编译器从现在开始发出警告 list
不是“类型安全的”,编写这行代码的选项只是为了向后兼容。
我不明白,也没有找到关于它的问题,是为什么?由于编译器仅通过“查看”静态引用来编译 Java 代码,因此编写的编译时间为何会有所不同 new ArrayList();
而不是 new ArrayList<>();
.
例如写这段代码:
List<String> list = new ArrayList(); // 1
list.add("A string"); // 2
list.add(new Object()); // 3
导致第 1 行出现编译警告,第 2 行没有编译问题,但第 3 行出现编译错误 - 安全类型。
因此 - 添加对第一行的通用引用 ( new ArrayList<>();
),只会导致删除编译器警告。
我知道使用原始类型是个坏习惯,但我的问题是将右侧写为原始类型有什么区别(编译警告除外)。
谢谢!
最佳答案
编译器不关心是什么机制创建了变量 list
引用的对象。事实上,它也可以引用 null
。或者它可以是对方法的调用。示例:
void yourMethod() {
List<String> list = createStringList();
...
}
List<String> createStringList() {
return new ArrayList(); // raw type here
}
当有一个正确类型的变量(没有用原始类型声明)时,这个变量的所有用法都会根据泛型类型进行检查。
另一件事是,如果您的变量本身是用原始类型声明的:示例:
List list = new ArrayList();
list.add("A string");
list.add(new Object());
这可以正常编译,但警告应该会提醒您,因为稍后可能会出错!
关于Java 原始类型声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45231470/