Java(1.6)泛型通配符

时间:2013-12-10 13:22:33

标签: java generics

考虑流动情况:

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

2 个答案:

答案 0 :(得分:6)

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

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

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

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

这些通配符的意思是功能 您可以创建一个List<? extends A>的函数,然后将其传递给List<B>List<C>,并且调用代码可以继续使用原始列表及其原始类型。

答案 1 :(得分:1)

没有区别。这一切归结为两个对象列表。你只是想哄骗编译器给你一个帮助,因为它非常聪明,可以帮助你捕获不良用法。你告诉它,只要列表中的类型是-A A,一切都很好。然后,编译器可以帮助突出显示任何问题。