【发布时间】:2013-10-08 17:48:08
【问题描述】:
List<? extends Object> list = new ArrayList<? extends Object>();
有没有人可以帮我解释一下为什么在使用 arraylist 时我不能将泛型扩展到 Object?
【问题讨论】:
-
您能以另一种方式解释您的问题吗?我想不出你不能做什么。
List<? extends Object> list = new ArrayList<? extends Object>();
有没有人可以帮我解释一下为什么在使用 arraylist 时我不能将泛型扩展到 Object?
【问题讨论】:
为什么在使用 arraylist 时我不能将泛型类超类到对象?
因为您无法实例化通配符参数化类型。您只能使用具体的参数化类型。通配符参数化类型出现在new 表达式中是非法的。
当然,您可以使用通配符参数化类型作为引用类型。将它们视为接口。您不能实例化接口本身,但可以将其用作引用类型。
因此,将您的声明更改为:
List<? extends Object> list = new ArrayList<Object>();
但这里唯一的问题是,您将无法在此列表中添加任何内容。事实上,我怀疑你真的需要这个列表声明。如果你只想要一个列表,你可以在其中添加一个类的任何对象及其任何子类,那么你不需要带上限的通配符。
例如,如果您想将 Employee、Doctor 和 Student 存储在同一个列表中,所有这些都从 Person 扩展而来,那么您可以简单地将列表声明为:
List<Person> persons = new ArrayList<Person>();
persons.add(new Employee()); // This is OK
persons.add(new Student()); // This too is OK
【讨论】:
List<?> 很少有用,因为除了null 之外,您无法向其中添加任何内容。好吧,您也不能向List<? extends Object> 添加任何内容。这些类型的声明类型通常用作形式参数类型,您可能希望在其中发送 List 的不同具体实例。