【发布时间】:2015-02-22 05:53:35
【问题描述】:
我一直在尝试使用泛型和多态性。我遇到了一个我无法理解的问题。
说我有
public abstract class Animal {
private age;
private weight;
public Animal(){}
public void Move(){
//stuff
}
public void Eat(){
//stuff
}
//Getters and setters
}
然后
public Cat extends Animal {
//Constructors
}
public Snake extends Animal {
//Constructors
public void ShedSkin(){
//stuff
}
}
我也有自己的课程“MyAbstractClass”。在这里,我似乎无法解决问题。
public abstract class MyAbstractClass {
private List<Animal> myAnimalList;
public MyAbstractClass(){}
public MyAbstractClass(List<? extends Animal> animalList) {
this.myAnimalList = animalList;
}
public List<Animal> getAnimalList() {
return myAnimalList;
}
//Stuff which DOES NOT add to the list
}
我希望能够做到:
public class MyCatClass extends MyAbstractClass {
public MyCatClass(List<Cat> catList) {
super(catList);
}
}
public class MySnakeClass extends MyAbstractClass {
public MySnakeClass(List<Snake> snakeList) {
super(snakeList);
}
public ShedSkin(){
(Snake)getAnimalList().get(0).ShedSkin(); //Dont worry about indexing
}
}
然后
public static void main(string[] args) {
//Make list of cats
//Make list of snakes
MyCatClass cats = new MyCatClass(catList);
MySnakeClass snakes = new MySnakeClass(snakeList);
snakes.ShedSkin();
}
这对我不起作用。它无法在public MyAbstractClass(List<? extends Animal> animalList) 编译。这有点超出我的 java 经验,非常感谢一些指导。我希望示例类足够清楚以理解我的意图。
编译器告诉我:java.util.List<Animal> in MyAbstractClass cannot be applied to java.util.List<capture<? extends Animal>>
谢谢。
编辑: 看来我必须说明我要做什么。我有一个动物列表,它们可能有也可能没有比超类更多的字段和方法,但它们都扩展了超类。 我还想要一个接收单一类型动物列表的类,并在列表中的每个元素上或之上调用方法。我不会在列表中添加任何内容,所以这应该不是问题。 我之所以这样分手,是因为所有的动物之间,有很多相似之处,但有些动物有特长。接受 List 的类需要能够处理这些特殊性。因此让工人类扩展一个超类并实现额外的方法。
编辑2: 解决了!
public abstract class MyAbstractClass {
private List<? extends Animal> myAnimalList;
public MyAbstractClass(){}
public MyAbstractClass(List<? extends Animal> animalList) {
this.myAnimalList = animalList;
}
public List<Animal> getAnimalList() {
return myAnimalList;
}
//Stuff which DOES NOT add to the list
}
字段和构造函数都需要为List<? extends Animal> foobar。
建设性的头脑风暴会议!
编辑3: 迪玛的方法更好。
【问题讨论】:
-
List<? extends Animal>和List<Animal>是不同的东西。第一个可以是List<Cat>,例如,您不能在其中添加Dog。第二个是可以添加任何Animal(猫或狗)的列表。集体歇斯底里!恰到好处tutorial topic.
标签: java generics inheritance polymorphism