泛型未经检查的警告转换

时间:2014-12-01 13:23:25

标签: java generics collections

我读过仿制药"? extends Object"和"?"是同义词然后发生的原因。

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

对于1个未经检查的转换警告被抛出但不是2.因此编译器某处肯定会区分这两者。 Plz解释了两者之间关于上述代码的区别

2 个答案:

答案 0 :(得分:2)

  

我读过仿制药&#34;? extends Object&#34;和&#34;?&#34;是同义词

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

这个下界可以有所作为:&#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>不是,这意味着它们从编译器的角度来看是不一样的。