Java 包含类缺少泛型类型时出现未选中的分配警告

Java 包含类缺少泛型类型时出现未选中的分配警告,java,generics,unchecked,Java,Generics,Unchecked,我在注释行中得到“Unchecked assignment:java.util.Listtojava.util.List”。 当GetList参数更改为GetList时,警告被清除 我不明白为什么GetList泛型类型会影响getIntegerList()的结果。在Intellij Idea和Eclipse中都尝试过。是正常还是警告信息错误 import java.util.ArrayList; import java.util.List; public class GetList<T&

我在注释行中得到“Unchecked assignment:
java.util.List
to
java.util.List
”。 当
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
    }
}
import java.util.ArrayList;
导入java.util.List;
公共类GetList{
private final List integerList=new ArrayList();
公共列表getIntegerList(){
返回整数列表;
}
}
导入java.util.List;
公共班机{
公用干管(GetList GetList){
List rahan=getList.getIntegerList();//此行显示上述警告
}
}

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

正如安迪·特纳(Andy Turner)和罗曼(Roman)在评论中指出的,这在(我的重点部分)中有详细说明:

未从其超类或超接口继承的原始类型C的构造函数(§8.8)、实例方法(§8.4,§9.4)或非静态字段(§8.3)的类型是对应于在对应于C的泛型声明中删除其类型的原始类型

换句话说,当一个类被用作原始类型时,编译器可以丢弃它的所有泛型信息

下面是另一个示例(带有稍微清晰的错误消息):

$cat Demo.java
导入java.util.*;
课堂演示{
公共列表ls(){返回新的ArrayList();}
公共静态void main(字符串[]args){
列表ls=新的Demo().ls();
}
}
$javac-Xlint:unchecked Demo.java
java:7:警告:[未选中]未选中的转换
列表ls=新的Demo().ls();
^
必填项:列表
找到:列表
1警告

使用rawtypes总是会导致该警告。顺便问一下,你真的需要
类中的
参数吗?@RaduIonescu或者它可能是你的IDE,因为我可以使用
javac-Xlint:warning
@FrancescoPitzalis进行复制这只是理解问题的一个SSCE。我在中找到的代码确实使用了泛型;然而,正如它在“强烈反对在Java编程语言中引入泛型之后编写的代码中使用原始类型”;因此,修复一个警告(通过
-Xlint:rawtypes
查看)也修复了手头的警告,这是令人高兴的(?)巧合。@而且相关段落是“构造函数的类型(§8.8)、实例方法(§8.4、§9.4)或非静态字段(§8.3)对于未从其超类或超接口继承的原始类型C,是对应于在与C对应的泛型声明中删除其类型的原始类型。“So
GetList.getIntegerList()
返回
List
GetList.getIntegerList()
返回
List
$ 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