用泛型覆盖

Chr*_*311 1 java generics abstract-class overriding

考虑以下抽象类

public abstract class AbstractAssembler {

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

}
Run Code Online (Sandbox Code Playgroud)

以及扩展名:

public class MyAssembler extends AbstractAssembler {

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

}
Run Code Online (Sandbox Code Playgroud)

MyValue

public class MyValue extends AbstractValue {

    // ...

}
Run Code Online (Sandbox Code Playgroud)

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

为什么这不起作用?

Kon*_*kov 5

您的transform()方法必须覆盖transform()超类中的泛型抽象方法,即您应该具有以下内容:

public class MyAssembler extends AbstractAssembler {

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

    }
}
Run Code Online (Sandbox Code Playgroud)

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

MyValue value = new MyValue();
new MyAssembler().transfer(value);
Run Code Online (Sandbox Code Playgroud)

其中显式指定type-parameter(new MyAssembler().<MyValue>transfer(value);)是可选的,因为它将由编译器推断.


不过,若你希望MyAssembertransform方式工作MyValue,那么你应该这样做:

public class MyAssembler extends AbstractAssembler<MyValue> {

    @Override
    public void transform(MyValue value) {

    }
}
Run Code Online (Sandbox Code Playgroud)