gpt4 book ai didi

java - 使用泛型参数覆盖方法

转载 作者:行者123 更新时间:2023-12-01 16:54:37 25 4
gpt4 key购买 nike

我引入了一个抽象 Actor 类,抽象动物类是其子类。我现在面临的问题是 Rabbit 类(动物的子类)中的 act 方法不起作用。

我收到以下错误

“Rabbit 不是抽象的,不会重写 Animal 中的抽象方法 act(java.util.List<Actor>)

我认为 Fox 中的 Rabbit 中的 act 方法会覆盖 Animal 和 Actor 中的 act 方法。我该如何解决这个问题?

下面是Actor类中的抽象方法

abstract public void act(List<Actor>newActors);

然后使用以下代码在 Animal 类中重写此方法

abstract public void act(List<Actor> newAnimals);

然后在rabbit和fox类中用下面的方法重写这个方法,这就是错误发生的地方。

  public void act(List<Animal> newRabbits)
{
incrementAge();
if(isAlive()) {
giveBirth(newRabbits);
// Try to move into a free location.
Location newLocation = getField().freeAdjacentLocation(getLocation());
if(newLocation != null) {
setLocation(newLocation);
}
else {
// Overcrowding.
setDead();
}
}
}

最佳答案

您的 List 的参数化类型是这里的问题,因为它在运行时被删除(参见 type erasure ),因此破坏了虚拟方法调用。

您可以使用List<? extends Actor>参数化您的方法在整个类层次结构中解决这个问题。

大致如下:

class Actor {

}
class Animal extends Actor {

}
abstract class Abstract {
abstract void act(List<? extends Actor> actors);
}
class Child extends Abstract {
@Override
void act(List<? extends Actor> actors) {
// TODO something
}
}

然后你用以下行来调用它:

new Child().act(new ArrayList<Animal>());

关于java - 使用泛型参数覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34769796/

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