繁体   English   中英

包含类的泛型类型缺失时,未经检查的分配警告

[英]Unchecked assignment warning when containing class is missing generic type

我在注释行java.util.List看到“未经检查的分配: 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
    }
}

如果您使用原始类型,则应该期望有许多奇怪的警告,并且这些警告在编译器之间不一定是一致的(您正在输入“未定义行为”区域)。

正如安迪·特纳(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM