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