java泛型和程序设计,如何正确实现包含超类子类型的列表?

java泛型和程序设计,如何正确实现包含超类子类型的列表?,java,oop,generics,inheritance,collections,Java,Oop,Generics,Inheritance,Collections,我有一个动物课和一些真实的动物,比如老鼠,马。。。它们是消耗类动物。现在我想创建一个类填充。一个种群有一个只包含一种动物的列表 我可以使用这种方法,但它相当难看。使用通配符时,在填充类上需要一个上限类型变量,在该类中需要一个列表,该列表必须仅包含该类型变量的实例: class Population<A extends Animal> { final List<A> animals = new ArrayList<>(); void add(A ani

我有一个动物课和一些真实的动物,比如老鼠,马。。。它们是消耗类动物。现在我想创建一个类填充。一个种群有一个只包含一种动物的列表


我可以使用这种方法,但它相当难看。使用通配符
时,在
填充
类上需要一个上限类型变量,在该类中需要一个
列表
,该列表必须仅包含该类型变量的实例:

class Population<A extends Animal> {
  final List<A> animals = new ArrayList<>();

  void add(A animal) {
    animals.add(animal);
  }
}
类人口{
最终列表动物=新的ArrayList();
(动物){
动物。添加(动物);
}
}
然后你可以像这样使用它:

Population<Dog> dogs = new Population<>();
dogs.add(new Dog());  // OK.

Population<Cat> cats = new Population<>();
cats.add(new Cat());  // OK.

dogs.add(new Cat());  // Compiler error.
cats.add(new Dog());  // Compiler error.
种群狗=新种群();
dogs.add(新的Dog());//好啊
种群猫=新种群();
cats.add(新的Cat());//好啊
dogs.add(新的Cat());//编译器错误。
cats.add(新狗());//编译器错误。

我已经使用了一个列表,但我在继承和泛型方面有问题,这正是我想要的。非常感谢。当一个答案解决了您的问题时,请单击答案旁边的复选标记接受它。当然,但我不得不等待几分钟。现在我可以接受了。对不起,我得问另一个问题。当我从外部调用add时,这非常有效,但是当我想在population类内部调用add()时,我能做什么呢?您可以调用
add(animal)
(或者
This.add(animal)
)。它与类外没有什么不同:您只能通过引用
a
或literal null来调用该方法。