gpt4 book ai didi

java - 构造函数中的继承

转载 作者:行者123 更新时间:2023-11-30 06:13:21 25 4
gpt4 key购买 nike

我的问题主要与这个有关 Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?

所以,假设我们有 Animal,它是 Cat 和 Dog 的 super 接口(interface)。我们还有一个抽象类 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,为什么类型参数的行为会有所不同?谁能解释为什么会这样?

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

最佳答案

您需要使用 bounded type parameter 使父类(super class)成为通用类说垃圾可以容纳什么样的动物:

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 指定类型来限制继承的父类(super class)方法将接受的动物种类。KittyLitteraddCub 方法采用 Cat 参数,而不是 AnimalPuppyLitteraddCub 将带一只 Dog

关于java - 构造函数中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32020636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com