【问题标题】:Unchecked assignment warning when containing class is missing generic type包含类时未检查的赋值警告缺少泛型类型
【发布时间】:2016-03-15 13:57:49
【问题描述】:

我在评论所在的行收到“未经检查的分配: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
    }
}

【问题讨论】:

  • 使用 rawtypes 总是会导致该警告。顺便说一句,您真的需要 GetList 类中的 &lt;T&gt; 参数吗?
  • @RaduIonescu 或者它是你的 IDE,因为我可以使用 javac -Xlint:warning 重现。
  • @FrancescoPitzalis 这只是一个用于理解问题的 SSCCE。我在其中找到的代码确实使用了泛型。
  • 我在 JLS 中找不到此警告的明显原因;然而,正如它在Section 4.8 中所说的那样,“强烈反对在将泛型引入 Java 编程语言之后编写的代码中使用原始类型”;所以很高兴(?)巧合,修复一个警告(通过-Xlint:rawtypes查看)也修复了手头的警告。
  • @AndyTurner 相关段落是“构造函数的类型(第 8.8 节)、实例方法(第 8.4 节、第 9.4 节)或原始类型 C 的非静态字段(第 8.3 节)不是从其超类或超接口继承的原始类型是对应于在对应于 C 的泛型声明中擦除其类型的原始类型。”所以GetList&lt;T&gt;.getIntegerList() 返回List&lt;Integer&gt;GetList.getIntegerList() 返回List

标签: java generics unchecked


【解决方案1】:

如果您使用原始类型,您应该会收到任意数量的奇怪警告,并且这些警告不一定会在编译器之间保持一致(您正在进入“未定义行为”领域)。

正如 Andy Turner 和 Roman 在 cmets 中所指出的,这在 JLS §4.8 中进行了说明(重点是我的):

构造函数的类型(第 8.8 节)、实例方法(第 8.4 节、第 9.4 节)或未从其继承的原始类型 C 的非静态字段(第 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多