[英]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”和“?” 是同义词
不完全的。 第一个通配符有下限,第二个没有。 对于你的两个例子,它应该没有区别(好吧,除了你只能向list2
和list3
添加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.