包含类时未经检查的赋值警告缺少泛型类型

时间:2016-03-15 13:57:49

标签: java generics unchecked

我在评论的行中收到“未经核查的作业:java.util.Listjava.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
    }
}

1 个答案:

答案 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