繁体   English   中英

泛型未经检查的警告转换

[英]generics unchecked warning conversion

我在泛型中读过“?extends Object”和“?” 是同义词然后发生这种情况的原因。

List list=new ArrayList();
List<? extends Object> list2=list;     //1
List<?> list3=list;                    //2

对于1个未经检查的转换警告被抛出但不是2。所以编译器某处肯定是在区分两者。 Plz解释了上述代码之间的差异

我在泛型中读过“?extends Object”和“?” 是同义词

不完全的。 第一个通配符有下限,第二个没有。 对于你的两个例子,它应该没有区别(好吧,除了你只能向list2list3添加null !)。

这个下限可能有所不同:“擦除签名”(我不知道确切的术语)。

最好的例子是Collections.max() ; 你会注意到参数类型定义为T extends Object & Comparable<? super T> T extends Object & Comparable<? super T>

这是因为在Java 5之前,这种方法存在并被定义为:

static Object max(Collection coll)

如果类型参数定义为T extends Comparable<? super T> T extends Comparable<? super T> ,这意味着1.4中的方法必须返回一个Comparable

由于在编译期间会删除某些类型信息,因此并非所有类型都在运行时可用。 在运行时完全可用的类型称为可重新类型 (请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7 )。

所以根据JLS List<?>是一个可重新生成的类型,但List<? extends Object> List<? extends Object>不是,这意味着它们从编译器的角度来看是不一样的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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