【发布时间】:2014-06-20 13:56:38
【问题描述】:
以下代码导致未经检查的转换编译器警告 -
{
List<String> first = first((Class)Integer.class);
}
private <T> List<String> first(Class<T> clazz) { return null; }
但是,以下代码没有任何警告 -
{
List<String> second = second((Class)Integer.class);
}
private List<String> second(Class<?> clazz) { return null; }
总共有三个警告,前两个是我预料到的,但第三个没有意义 -
$ 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
我的问题是,为什么会出现第三个编译器警告?
【问题讨论】:
-
第一个代码示例生成编译器警告。第二个(非常相似)没有。我想我们需要 Sherlock 来猜猜这里的问题是什么……
-
我的猜测是传入一个原始类型
Class(而不是Class<?>或Class<Integer>)会使first签名中的<T>无效方法,并且由于某种原因导致整个方法调用被视为原始调用。因此,它不仅使<T>无效,而且使返回类型中的<String>无效。 -
尝试从第一段代码中删除
<T>---private <T> List<String> first(Class<T> clazz) { return null; } -
@VGR 是的,我进一步调查并发现了这个 -snipurl.com/unchecked 我是 Stackoverflow 的新手,所以不太确定它是如何工作的......你想发表评论吗完整的回复,以便我可以将其标记为答案?
标签: java generics jdk1.6 unchecked