用泛型覆盖

Overriding with generics

考虑以下摘要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) 必须覆盖或实现超类型方法

为什么这不起作用?

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

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) {

    }
}