gpt4 book ai didi

java - 具有泛型的类将自身引用为 Java 中该泛型的类型

转载 作者:行者123 更新时间:2023-11-30 10:26:23 24 4
gpt4 key购买 nike

我有几个类是 Animal 的子类,Animal 本身是 Lifeform 的子类。所有这些类都有一个子类,它总是属于它自己的类型,因此是通用的。简化代码如下:

public class Animal<T extends Animal> extends Lifeform {
T child;

private void initiate() {
setChild(Animal.class);
}

public void setChild(Class<T> animalType) {
T foundChild = findChild(animalType);
foundChild.setParent(this);
this.child = foundChild;
}
}

其中 findChild 是一个继承方法:

public abstract class Lifeform {
private <L extends Lifeform> L findChild(Class<L> lifeformType) {
/* Do some stuff with lifeformType to find child */
...
return child;
}
}

请注意,大多数生命体不会有 child ,即使识别 child 的方法在生命体类中。

我在尝试调用 Animal.initiate() 中的 setChild(Animal.class) 时遇到编译错误。

incompatible types: java.lang.Class<Animal> cannot be converted to java.lang.Class<T>

T extends Animal,为什么我不能在这里使用 Animal.class 作为参数?

最初我在没有任何参数的情况下创建了 setChild 并尝试这样做

findChild(T.class)

但是我意识到我无法从这样的泛型中获取类,并且发现一个常见的解决方案是将类添加为参数,这就是我最终得到现在所拥有的东西的方式。

如果我尝试在子类中使用 setChild,我没有问题:

public class Bat extends Animal<Bat> {
private void fly() {
setChild(Bat.class);
child.fly();
}
}

不幸的是,在某些情况下我实际上需要一个没有子类型的动物实例,因此我希望能够将 setChild 设置为 Animal 作为类型。

我意识到我可以为 Animal 创建一个额外的子类,而不是有一个包含 setChild 方法的抽象类 AnimalAbstract。然而,这意味着我必须根据它们的使用方式将方法与 Animal 分开。

还有其他方法可以实现吗?

最佳答案

在我看来,解决这个问题的一种方法是保留对子类的引用:

public class Animal<T extends Animal> extends Lifeform {
protected final Class<T> childClass;
T child;

public Animal(Class<T> childClass) {
this.childClass = childClass;
}

protected void initiate() {
setChild(childClass);
}

public void setChild(Class<T> animalType) {
T foundChild = findChild(animalType);
foundChild.setParent(this);
this.child = foundChild;
}
}

Bat 类将变为:

public class Bat extends Animal<Bat> {
public Bat() {
super(Bat.class);
}

private void fly() {
setChild(Bat.class); // or initiate();
child.fly();
}
}

关于java - 具有泛型的类将自身引用为 Java 中该泛型的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45735905/

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