我的问题在很大程度上与此Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?
因此,假设我们有动物,它是猫和狗的超级界面。我们还有一个抽象类Litter这样
public abstract class Litter{
public Litter(Collection<Animal> animals){}
}
然后我们自然有一个具体的类KittyLitter
public class KittyLitter extends Litter{
public KittyLitter(Collection<Cat> animals) {
super(animals);
}
}
...和小狗垃圾
自然,我们希望将KittyLitter中的所有Animal限制为Cat。 Java为什么不允许我们这样做?然后,也可以说我们添加了另一种方法-
public abstract void addCub(Animal animal);
KittyLitter中的具体实现
@Override
public void addCub(Animal cat) {
// TODO Auto-generated method stub
}
在这一点上,这打破了逻辑,并允许我们将Dog插入KittyLitter中,这没有任何意义。关于Java为什么要对我们做这些事情的任何想法?另外,如果可以将KittyLitter构造函数更改为接受List,为什么type参数的行为会有所不同?谁能解释为什么会这样?
编辑:这实际上不是关于构造函数,而是任何覆盖的方法。
最佳答案
您需要使用bounded type parameter来使超类泛型化,以说明垃圾可以容纳哪种动物:
public abstract class Litter<T extends Animal> { // <-- type bound
public Litter(Collection<T> animals) { /* ... */ }
public void addCub(T cub) { /* ... */ }
}
public class KittyLitter extends Litter<Cat> {
public KittyLitter(Collection<Cat> cats) {
super(cats);
}
}
通过指定T的类型,这允许子类限制继承的超类方法将接受哪种动物。
KittyLitter
的addCub
方法采用Cat
参数,而不是Animal
。而PuppyLitter
的addCub
将采用Dog
。