Java(1.6)泛型通配符

whi*_*rru 5 java generics

考虑流动情况:

    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'有什么区别?

SLa*_*aks 6

你写它的方式,没有区别.

在编译时,两者都具有相同的类型; 即,一种List<>延伸的未知类型A.
这就是为什么你不能在任何一个列表中添加任何内容的原因 - 你不知道它实际上是一个List<B>还是一个List<C>或其他类型.

在运行时,它们也具有相同的类型; 即,List.由于类型擦除,类型参数在运行时不存在.

因为你没有保存任何更强类型的引用,所以没有人可以告诉其中一个列表实际上是一个List<B>.

这些通配符的意义在于功能.
你可以创建一个函数,它接受a List<? extends A>,然后传递一个List<B>或一个List<C>,并且调用代码可以继续使用原始类型的原始列表.