【问题标题】:Arraylist generics super classing the Object class [duplicate]Arraylist泛型超类Object类[重复]
【发布时间】:2013-10-08 17:48:08
【问题描述】:
    List<? extends Object> list = new ArrayList<? extends Object>();

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

【问题讨论】:

  • 您能以另一种方式解释您的问题吗?我想不出你不能做什么。

标签: java generics


【解决方案1】:

为什么在使用 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

【讨论】:

  • 这意味着我可以这样吗?人 p = 新人();员工扩展人医生扩展人... list.add... .. Person p = list.get(0); if( p instanceof Doctor) { //我可以得到医生对象吗? }
  • 顺便感谢您的清晰解释,我认为我不能那样做.. 我需要知道如何那样做是有原因的
  • @Spurdow 检查我的编辑。
  • @GriffeyDog。 List&lt;?&gt; 很少有用,因为除了null 之外,您无法向其中添加任何内容。好吧,您也不能向List&lt;? extends Object&gt; 添加任何内容。这些类型的声明类型通常用作形式参数类型,您可能希望在其中发送 List 的不同具体实例。
  • @RohitJain 谢谢老兄,就可以了。
猜你喜欢
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多