2015-12-02 75 views
-1

比方说,我有有一些methodes A级。然后我有一个扩展A的类B,但有一个额外的变量。现在我想在另一个类中有一个A和B的ArrayList,所以当我遍历该列表时,即使用一个.getName()方法,我就可以得到两个类的名称?我是否创建ArrayList<A>并向其添加A和B的实例,或者创建ArrayList<Object>?在ArrayList<Objects>的情况下,如何在不同的对象上调用.getName()ArrayList中含有继承类

回答

1

您可以创建与设置为A,B类型参数ArrayList中继承了A的所有属性和方法,这意味着你可以访问它们的B中完全相同的方式,你在A.访问它们然而,如果你的想要访问B中不存在的属性,您必须投射它。例如,

for (A p: aList) { 
    p.methodFromA(); 
    if (p instanceof B) { 
    B q = (B) p; 
    q.methodOnlyBHas(); 
    // or 
    ((B)p).methodOnlyBHas(); 
    } 
} 

如果创建了一个ArrayList对象,则必须将每个元素都转换为所需的类。这几乎否定了泛型背后的想法,并且与创建没有类型参数的ArrayList没有什么不同。你应该避免这样做,这样你就可以获得仿制药给你的好处,例如在编译时输入错误,而不是在运行时抛出异常。

+0

但是如果我想打印出这个对象,也就是说A有一个叫做'name,size,color'的som变量和B有相同的结果,但是也有'weight'这个变量,我怎样才能得到所有的变量A和全部来自B?像: '对于(A号码:ALIST){ 打印(P) }',但我还希望打印类型B的对象在'的ArrayList '?如果它是有道理的.. – Lasse

+1

我已经更新了答案,以便我可以添加代码示例,希望可以帮助 – ewanc

+0

太棒了!谢谢! :) – Lasse

0

ArrayList<A>会为A和B,没有必要去更多的泛化,即目标工作。

如何调用getName()取决于其中getName()定义。 如果是在A,你可以把它在ArrayList所有对象,但如果方法只在B,您可能需要检查instanceof B,然后调用方法。