0

更新:我的课程比这更复杂,我只是卡在 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);

希望这更有意义。因此,我的问题是什么是???位?

4

3 回答 3

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());
于 2012-07-28T16:17:16.243 回答
1

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

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

然后像这样从 Animal 继承:

public class Cat extends Animal
{
    ...
}

从现在开始,您可以像这样创建一个 ArrayList:

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

如果您无论如何都想创建一个 AnimalList,那么您最好的选择是 Andreas 的解决方案,泛型适用于这种情况。

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

于 2012-07-28T16:51:46.587 回答
1

如前所述,您可能希望为 Cat 和 Dog 定义一个基类 Animal,然后:

class AnimalList<T extends Animal> {

    private List<T> animals;

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

如果您需要传递 Class 您可能希望将 yje 构造函数定义为:

AnimalList(Class<T> type) { … }

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

private AnimalList<? extends Animal> list;
于 2012-07-28T19:26:30.560 回答