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

标签 java generics inheritance type-erasure

我引入了一个抽象 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/

相关文章:

java - Java中如何从工作目录返回上一个目录?

java - 在 Tomcat/Glassfish 中部署 Java 应用程序

JavaFX - ListView <?扩展 V> - 泛型 - CellFactory

java - 填充和排序列表 <?扩展条款与条件>

c++ - 什么是 std::map<K,V>::map;以及如何知道在实现/使用 STL 容器和函数时使用什么命名空间?

unit-testing - Kentico 9 的单元测试项目测试在测试资源管理器中不可见

java - Maven 生成 jar 依赖然后 war

java - 解析 XML 时出错 : not well-formed (invalid token) while making app

delphi - 为什么我不能传递 TObjectList<S : T> to a function expecting a TObjectList<T>?

java - 包之间的继承不存在?