构造函数中的继承

aig*_*guy 2 java inheritance constructor

我的问题主要涉及这个列表<Dog> List <Animal>的子类?为什么Java的泛型不是隐式多态的?

所以,我们说动物是猫与狗的超级界面.我们还有一个抽象类垃圾

public abstract class Litter{

    public Litter(Collection<Animal> animals){}
}
Run Code Online (Sandbox Code Playgroud)

然后我们自然会有一个具体的类KittyLitter

public class KittyLitter extends Litter{

    public KittyLitter(Collection<Cat> animals) {
        super(animals);
    }
}
Run Code Online (Sandbox Code Playgroud)

......还有小狗垃圾.

当然,我们希望将KittyLitter中的所有Animal限制为Cat.为什么Java不允许我们这样做?然后,还可以说我们添加另一种方法 -

public abstract void addCub(Animal animal);
Run Code Online (Sandbox Code Playgroud)

KittyLitter中的具体实现

@Override
public void addCub(Animal cat) {
    // TODO Auto-generated method stub
}
Run Code Online (Sandbox Code Playgroud)

在这一点上,这打破了逻辑,并允许我们将Dog插入到没有意义的KittyLitter中.关于为什么Java会对我们做这些事情的任何想法?另外,如果可以将KittyLitter构造函数更改为接受List,为什么type参数的行为会有所不同?任何人都可以解释为什么会这样吗?

编辑:这不是关于构造函数,而是任何覆盖的方法.

Wyz*_*a-- 5

您需要使用有界类型参数使超类具有通用性,以说明垃圾可以容纳哪种动物:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

这允许子类通过为T指定类型来限制继承的超类方法将接受哪种动物 KittyLitter.addCub方法采用Cat参数,而不是Animal.和PuppyLitteraddCub将采取Dog.