2013-10-08 88 views
1
List<? extends Object> list = new ArrayList<? extends Object>(); 

有没有人可以帮助我解释为什么不能使用arraylist扩展泛型到对象?Arraylist泛型超类对象类

+1

你能解释一下你的问题是另一种方式?我无法弄清楚你不能做什么。 –

回答

7

为什么不能使用数组列表时,我超级类通用对象?

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

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

所以,你的声明更改为:

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

但在这里,你将无法添加任何东西到这个名单的唯一问题。事实上,我怀疑你真的需要这份名单声明。如果你只是想要一个列表,你可以添加任何一个类的对象和它的任何子类,那么你不需要通配符的上限。

对于例如,如果你想存储EmployeeDoctor,并且Student,在同一个列表,其中所有的人都从Person延长,那么你可以简单地声明为列表:

List<Person> persons = new ArrayList<Person>(); 
persons.add(new Employee()); // This is OK 
persons.add(new Student()); // This too is OK 
+0

很好说。 –

+0

这意味着我可以这样吗? Person p = new Person(); 雇员延伸人 医生延伸人 ... list.add ... .. 人员P = list.get(0); if(p instanceof Doctor){ //我可以得到医生的对象? } – Spurdow

+0

顺便说一句,谢谢你的明确解释,我以为我不能这样做..这就是为什么我需要知道如何做到这一点的原因 – Spurdow