考虑流动情况:
class A {
}
class B extends A {
}
List <? extends A> x = new ArrayList<A>();
List <? extends A> xx = new ArrayList<B>();
'x'和'xx'都是Java 6和Java 7中的合法声明(我知道在Java 7中你也可以用一组空的类型参数(&lt;&gt;)替换构造函数的参数化类型)但是,我想知道,Java 6中'x'和'xx'之间有什么区别?
答案 0 :(得分:6)
你写它的方式,没有区别。
在编译时,两者都具有相同的类型;即List<>
某种未知类型,A
。{。}
这就是为什么您无法在任何一个列表中添加任何内容的原因 - 您不知道它实际上是List<B>
还是List<C>
还是其他类型。
在运行时,它们也具有相同的类型;即List
。由于类型擦除,类型参数在运行时不存在。
因为你没有保存任何更强类型的引用,所以没有人可以告诉其中一个列表实际上是List<B>
。
这些通配符的意思是功能
您可以创建一个List<? extends A>
的函数,然后将其传递给List<B>
或List<C>
,并且调用代码可以继续使用原始列表及其原始类型。
答案 1 :(得分:1)