2012-09-20 31 views
0

我有一個空的抽象基類:問題實例化一個基類的擴展

public abstract class base{ } 

和兩個類,擴展它:

public class a extends base{} 
public class b extends base{} 

,並在另一個類中,我引用它:

public class it { 

    List<base> list; 
    list = new ArrayList<a>; 

    //getting an error above. 
    // I thought I could do this? 
} 

我該怎麼辦?我正在嘗試獲取基類的列表。然後基於情況,能夠創建兩個擴展類的列表。

+2

請尊重的Java命名約定:上課的時間用大寫字母。 –

+0

下面的答案有它,只是一個大寫字母的旁邊點類名。公共類Base。公共課A擴展了Base ...這是一個小點,但這對於堅持公約很有幫助。 – RossC

回答

0

如果我想要做這樣的事情:

List<b> getBList(){ 

    if (baseList instanceof b){ 
     return (List<b>) baseList<base>; 
    } 
    else return null; 

} 
4

您可以創建列表如下:

list = new ArrayList<base>(); 

該列表可以包含從類型的項目和B.FOR比如下面是確定

A a = new A(). 
list.add(a); 
+0

這回答得很好。值得一讀關於ArrayList(對我越來越有用)和泛型。 http://docs.oracle.com/javase/tutorial/java/generics/ – RossC

4

List<base>List<a>是不一樣的類型或相關的任何類層次結構。僅僅因爲兩個集合中元素的類型是相關的,並不會使集合實例相關。

可以添加base的dervied類相同List<base>實例:

List<base> list = new ArrayList<base>(); 

list.add(new a()); 
list.add(new b()); 

查看Java教程Generics and Subtyping

2

List<Base>List<A>和不同的類型。他們沒有繼承關係。

但是你可以聲明如下:

List<? extends base> list; 

list = new ArrayList<a> 

見「有效的Java」泛型類型。

1

這個代碼不工作的原因是,雖然所有a實例是base的情況下,並不是所有的base實例都a情況下(如b)。

具體來說,List<base>意味着你可以添加ab實例名單:

List<base> bases = new ArrayList<base>(); 
bases.add(new a()); 
bases.add(new b()); 

這將正確編譯,因爲一切都在basesbase一個實例。

在另一方面,如果允許的Java您使用您的代碼:

List<base> bases = new ArrayList<a>(); 
bases.add(new a()); 
bases.add(new b()); 

添加b將其添加的東西,應該只接受a實例。因此,Java通過禁止該語句進行編譯來防止這種情況發生。

+0

+1對於OP的清晰解釋:) – Abbas