我在评论的行中收到“未经核查的作业: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
}
}
答案 0 :(得分:0)
如果您使用原始类型,您应该会遇到任意数量的奇怪警告,并且这些警告不一定在编译器之间保持一致(您正在进入“未定义行为”区域)。
正如安迪·特纳和罗马在评论中所指出的那样,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