2012-07-28 35 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;