如果我有这样的清单:
static ArrayList<? extends A> list = new ArrayList<A>();
? extends A
有什么意义?这是否意味着我只列出了必须从A继承的子类?
通常我会这样做:
static ArrayList<A> list = new ArrayList<A>();
答案 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
是任何类型,匹配Foo
和Foo
的任何子类型。
所以,回答问题“这是否意味着我只列出了必须从A继承的子类?”
这意味着您要列出的对象列表为A
或继承自A
。
修改强>
一个区别在于第二个代码
ArrayList<A> list = new ArrayList<A>();
您可以在代码中的任何位置引用类型A
。