&#34 ;?的目的是什么?扩展A"?

时间:2014-05-25 06:58:42

标签: java generics

如果我有这样的清单:

static ArrayList<? extends A> list = new ArrayList<A>();

? extends A有什么意义?这是否意味着我只列出了必须从A继承的子类?

通常我会这样做:

static ArrayList<A> list = new ArrayList<A>();

2 个答案:

答案 0 :(得分:3)

extends关键字表示此关键字左侧的类将使用右侧类中的所有方法和属性。 ?不会在那里。有些名字会。一个班级的名字。

static ArrayList<? extends A> list = new ArrayList<A>();

在上面的代码中,您创建了一个新的ArrayList对象,该对象使用(实现/扩展)类A作为其方法和属性,但不是真正的A }。

static ArrayList<A> list = new ArrayList<A>();

在您经常使用的第二个代码中,您实际上正在创建一个使用真实类A的对象。

在Java中,我们称之为继承,其中一个类继承了另一个类的所有属性和功能。

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

答案 1 :(得分:2)

来自Java Docs

  

上限通配符<? extends Foo>,其中Foo是任何类型,匹配FooFoo的任何子类型。

所以,回答问题“这是否意味着我只列出了必须从A继承的子类?”

这意味着您要列出的对象列表A或继承自A

修改

一个区别在于第二个代码

ArrayList<A> list = new ArrayList<A>();

您可以在代码中的任何位置引用类型A