Java 原始类型声明

标签 java generics compilation compiler-warnings

好吧,这个站点上有很多关于 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/

相关文章:

Java Generics - 难以执行强类型检查

PHP脚本压缩/"Compilation"工具

java - 非法参数异常 readExceptionFromParcel

java - 为什么传递给 List 参数的 List<Integer> 上的 add(String) 不抛出异常?

java - FTP 看起来像 java/HTML 中的应用程序

java - Java 中子类和集合之间的类转换异常问题

javascript - 在 Javascript VM 之上编写另一种语言?

c++ - 如何在 -std=c++11 -Weverything -Werror 中使用 clang++

java - 谷歌地图实用程序安装

java - 用简单的英语解释协变、不变和逆变?