java - 用泛型覆盖

标签 java generics overriding abstract-class

考虑下面的抽象类

public abstract class AbstractAssembler {

    public abstract <T extends AbstractValue> void transform(T value);

}

和以下扩展:

public class MyAssembler extends AbstractAssembler {

    @Override
    public void transform(MyValue value) {
        // ...
    }

}

使用MyValue

public class MyValue extends AbstractValue {

    // ...

}

Eclipse 告诉我: MyAssembler 类型的方法 transform(MyValue) 必须覆盖或实现父类(super class)型方法

为什么这不起作用?

最佳答案

你的 transform()方法必须覆盖通用抽象 transform()父类(super class)中的方法,即你应该有类似的东西:

public class MyAssembler extends AbstractAssembler {

    @Override
    public <T extends AbstractValue> void transform(T value) {

    }
}

如果您想使用实际类型(例如 MyValue)调用它,您应该这样做:

MyValue value = new MyValue();
new MyAssembler().transfer(value);

显式指定类型参数 ( new MyAssembler().<MyValue>transfer(value);) 是可选的,因为它将由编译器推断。


如果您希望 MyAssembertransform MyValue一起工作的方法,那么你应该这样做:

public class MyAssembler extends AbstractAssembler<MyValue> {

    @Override
    public void transform(MyValue value) {

    }
}

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

相关文章:

c# - 为什么 C# 不允许泛型属性?

java - XMLEventReader 返回 STAX

java - 在 Java 中读取 HTTP 消息

java - Java 中类型删除后具有相同签名的静态方法

ios - swift 。如何从扩展中获取泛型?

c++ - 如何为可覆盖方法提供默认实现?

javascript - 如何从 JavaScript 文件覆盖 html 元素

python - 在 Python 中更改重写类方法的参数数量是一种不好的做法吗?

java - Hibernate 持久映射

java - JSTL 在 Java EE 6 中的地位