1
    List<? extends Object> list = new ArrayList<? extends Object>();

有没有人可以帮我解释为什么在使用arraylist时我不能将泛型扩展到Object?

4

1 回答 1

7

为什么在使用arraylist时我不能对对象的泛型进行超类?

因为您无法实例化通配符参数化类型。您只能使用具体的参数化类型。通配符参数化类型出现在new表达式中是非法的。

当然,您可以使用通配符参数化类型作为引用类型。将它们视为接口。您不能实例化接口本身,但可以将其用作引用类型。

因此,将您的声明更改为:

List<? extends Object> list = new ArrayList<Object>();

但这里唯一的问题是,您将无法在此列表中添加任何内容。事实上,我怀疑你真的需要这个列表声明。如果您只想要一个列表,您可以在其中添加类的任何对象及其任何子类,那么您不需要带有上限的通配符。

例如,如果您想将EmployeeDoctorStudent, 存储在同一个列表中,所有这些都从 扩展Person,那么您可以简单地将列表声明为:

List<Person> persons = new ArrayList<Person>();
persons.add(new Employee());  // This is OK
persons.add(new Student());   // This too is OK
于 2013-10-08T17:50:55.720 回答