更新:我的类比这更复杂,我只是停留在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);
希望这更有意义。我的问题是什么?位?
答案 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;