2012-07-28 65 views
0

更新:我的課是比這更復雜,我只是我被困在ArrayList的線摘要列表<Person>

我有以下類別:

class CatList { 

    List<Cat> cats = new ArrayList<Cat>(); 

} 

class DogList { 

    List<Dog> dogs = new ArrayList<Dog>(); 

} 

貓和狗都是數據類。

,但我想創建一個抽象類:

abstract class AnimalList { 

    List<???> animals; 

    AnimalList(Class animal) { 

     animals = new ArrayList<???>(); 

    } 
} 

,這樣我可以繼承我的班

AnimalList CatList = new AnimalList(Cat); 
AnimalList DogList = new AnimalList(Dog); 
AnimalList CowList = new AnimalList(Cow); 

希望這更有意義。我的問題是什麼?位?

+3

你是什麼確切q題目了吧? – apnorton 2012-07-28 15:58:45

回答

5

使用類型參數可能會解決您的問題 - 使用同一類的不同類型 - 無繼承:

public class AnimalList<T> { 
    private List<T> list = new ArrayList<T>(); 

    public void add(T animal) { 
    list.add(animal); 
    } 
    // more methods 
} 

現在你可以parametize情況下對人員和動物:

AnimalList<Cat> catList = new AnimalList<Cat>(); 
catList.add(new Cat()); 
AnimalList<Dog> dogList = new AnimalList<Dog>(); 
dogList.add(new Dog()); 
+0

謝謝Andreas_D我沒有解釋得很好。 ArrayList代碼只是我試圖實現的一部分,我只是不確定的語法? – FrinkTheBrave 2012-07-28 16:27:11

+0

啊我現在看到了。我必須使用 thingy :-)並且我不需要構造函數,即public class AnimalList { List animals = new ArrayList (); } – FrinkTheBrave 2012-07-28 16:42:09

1

我的建議是,爲狗和貓創建一個基類,讓我們說動物。這樣,您就饒了自己一些時間,因爲你不必寫在兩個類相同的方法和成員,它的工作原理是這樣的:

public (abstract) class Animal 
{ 
    members and functions, that both Cats, and Dogs have... 
} 

然後繼承動物是這樣的:

public class Cat extends Animal 
{ 
    ... 
} 

從現在開始,你可以創建這樣一個ArrayList:

ArrayList<Animal> animals = new ArrayList<Animal>(); 
animals.add(new Cat()); 
animals.add(new Dog()); 

。如果你想創建一個AnimalList,那麼你最好的選擇是安德烈亞斯的解決方案,仿製藥是指爲這些き情況。

如果你知道,繼承是如何工作的,而且你已經考慮過構建你的應用程序,那麼對我的文章感到抱歉!

1

正如有人說,你可能希望定義爲貓與狗,然後基類動物:

class AnimalList<T extends Animal> { 

    private List<T> animals; 

    protected AnimalList() { 
     animals = new ArrayList<T>(); 
    } 
} 

如果你需要通過類,你可能魔杖定義YJE構造函數:

AnimalList(Class<T> type) { … } 

如果您需要處理一些AnimalList由於一些未知的動物類型您可以使用:

private AnimalList<? extends Animal> list;