[英]Unchecked assignment warning when containing class is missing generic type
我在注释行java.util.List
看到“未经检查的分配: java.util.List
到java.util.List<java.lang.Integer>
”。 将GetList
参数更改为GetList<?>
时,将清除警告。
我不明白为什么GetList
泛型类型会影响getIntegerList()
的结果。 在Intellij Idea和Eclipse中都进行了尝试。 这是正常现象还是警告消息错误?
import java.util.ArrayList;
import java.util.List;
public class GetList<T> {
private final List<Integer> integerList= new ArrayList<Integer>();
public List<Integer> getIntegerList() {
return integerList;
}
}
import java.util.List;
public class Main {
public Main(GetList getList) {
List<Integer> rahan = getList.getIntegerList(); //this line shows the warning above
}
}
如果您使用原始类型,则应该期望有许多奇怪的警告,并且这些警告在编译器之间不一定是一致的(您正在输入“未定义行为”区域)。
正如安迪·特纳(Andy Turner)和罗曼(Roman)在评论中指出的那样,这在JLS§4.8 (重点是我的)中有详细说明:
未从其超类或超接口继承的原始类型C的构造函数(第8.8节), 实例方法 (第8.4节,第9.4节)或非静态字段(第8.3节)的类型是与之相对应的原始类型。在对应于C的通用声明中删除其类型 。
换句话说,允许编译器在将其用作原始类型时丢弃有关该类的所有通用信息。
这是另一个示例(错误消息稍微清晰一些):
$ cat Demo.java
import java.util.*;
class Demo<T> {
public List<Integer> ls() { return new ArrayList<>(); }
public static void main(String[] args) {
List<Integer> ls = new Demo().ls();
}
}
$ javac -Xlint:unchecked Demo.java
Demo.java:7: warning: [unchecked] unchecked conversion
List<Integer> ls = new Demo().ls();
^
required: List<Integer>
found: List
1 warning
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.