Java “意外”;“未经检查的转换”;警告

Java “意外”;“未经检查的转换”;警告,java,generics,jdk1.6,unchecked,Java,Generics,Jdk1.6,Unchecked,以下代码导致未经检查的转换编译器警告- { List<String> first = first((Class)Integer.class); } private <T> List<String> first(Class<T> clazz) { return null; } 我的问题是,为什么会出现第三个编译器警告?因为您正在使用预泛型(raw)传递参数 而不是 first((Class<?>)Integer.class)

以下代码导致未经检查的转换编译器警告-

{
    List<String> first = first((Class)Integer.class);
}

private <T> List<String> first(Class<T> clazz) { return null; }

我的问题是,为什么会出现第三个编译器警告?

因为您正在使用预泛型(raw)传递参数

而不是

first((Class<?>)Integer.class)
first((类)Integer.Class)
first
的返回类型被降级为pre-generic
List
而不是
List
,并且在
List
预期的位置使用
List
会导致未经检查的转换警告


关于解释的Java文档:

原始类型出现在遗留代码中,因为许多API类(如Collections类)在JDK5.0之前不是泛型的。当使用原始类型时,您基本上得到了预泛型行为—一个框为您提供了对象为了向后兼容,允许将参数化类型分配给其原始类型:

但如果将原始类型指定给参数化类型,则会收到警告:


我的猜测是,传入一个原始类型,
Class
(而不是说,
Class
Class
),会使
第一个
方法的签名中的
无效,并且由于某种原因导致整个方法调用被视为原始调用。因此,它不仅使返回类型中的
无效,而且使
无效。

第一个代码示例生成编译器警告。第二个(非常相似)没有。我想我们需要Sherlock来猜测这里的问题是什么……我的猜测是,传入一个原始类型,
(而不是说,
),会使
第一个
方法的签名中的
无效,由于某种原因,导致整个方法调用被视为原始调用。因此,它不仅使返回类型中的
无效,而且使
无效。尝试从第一段代码中删除
——
private List first(Class clazz){return null;}
@VGR是的,我进一步研究了这一点,发现了这一点-我是Stackoverflow的新手,所以不确定这是如何工作的。。。你想让你的评论成为一个完整的回应,这样我就可以把它标记为答案了吗?看起来这个调用的(整个)泛型都被关闭了+1@BheshGurung对为了向后兼容,从以原始类型作为输入的运算符派生的任何类型都必须生成原始类型或非泛型类型。这样,库可以添加泛型,而预泛型(可能是类型不合理的)客户机代码仍然可以针对它们进行编译。当泛型首次引入时,项目的逐段迁移是一个高度优先事项。
$ javac Test1.java -Xlint
    Test1.java:6: warning: [unchecked] unchecked conversion
    found   : java.lang.Class
    required: java.lang.Class<T>
    List<String> first = first((Class)Integer.class);
                               ^
    Test1.java:6: warning: [unchecked] unchecked method invocation: <T>first(java.lang.Class<T>) in Test1 is applied to (java.lang.Class)
    List<String> first = first((Class)Integer.class);
                              ^
    Test1.java:6: warning: [unchecked] unchecked conversion
    found   : java.util.List
    required: java.util.List<java.lang.String>
    List<String> first = first((Class)Integer.class);
                              ^
    3 warnings
$ javac -version
    javac 1.6.0_45
first((Class)Integer.class)
first((Class<?>)Integer.class)