摘要列表<person> </person>

时间:2012-07-28 15:51:49

标签: java android arraylist abstract-class

更新:我的类比这更复杂,我只是停留在ArrayList行

我有以下课程:

class CatList {

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

}

class DogList {

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

}

Cat和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 个答案:

答案 0 :(得分:5)

使用类型参数可以解决您的问题 - 对不同类型使用相同的类 - 没有继承:

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

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

现在,您可以为人和动物的实例进行参数化:

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

答案 1 :(得分:1)

我的建议是,为Dog和Cat创建一个基类,让我们说动物。这样你就可以节省一些时间,因为你不必在两个类中编写相同的方法和成员,它的工作原理如下:

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,那么你最好的选择是Andreas的解决方案,泛型是针对这种情况的。

如果你知道,继承是如何工作的,你已经考虑像这样构建你的应用程序,那么对不起我的帖子了!

答案 2 :(得分:1)

如前所述,您可能想要为Cat和Dog定义基类Animal,然后:

class AnimalList<T extends Animal> {

    private List<T> animals;

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

如果你需要传递类,你可能会将yje构造函数定义为:

AnimalList(Class<T> type) { … }

如果您需要为某些未知的Animal类型处理某些AnimalList,您可以使用:

private AnimalList<? extends Animal> list;