我读过仿制药"? extends Object"和"?"是同义词然后发生的原因。
List list=new ArrayList();
List<? extends Object> list2=list; //1
List<?> list3=list; //2
对于1个未经检查的转换警告被抛出但不是2.因此编译器某处肯定会区分这两者。 Plz解释了两者之间关于上述代码的区别
答案 0 :(得分:2)
我读过仿制药&#34;? extends Object&#34;和&#34;?&#34;是同义词
不完全。第一个通配符有下限,第二个没有。对于您的两个示例,它应该没有区别(好吧,除了您只能将null
添加到list2
和list3
!)。
这个下界可以有所作为:&#34;擦除签名&#34; (我不知道确切的用语)。
最好的例子是Collections.max()
;您会注意到参数类型定义为T extends Object & Comparable<? super T>
。
这是因为在Java 5之前,这种方法存在并被定义为:
static Object max(Collection coll)
如果类型参数定义为T extends Comparable<? super T>
,这意味着1.4中的方法必须返回Comparable
!
答案 1 :(得分:0)
由于在编译期间会删除某些类型信息,因此并非所有类型在运行时都可用。在运行时完全可用的类型称为可再现类型(请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7)。
因此根据JLS List<?>
是一个可重新生成的类型,但List<? extends Object>
不是,这意味着它们从编译器的角度来看是不一样的。