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)必须覆盖或实现超类型方法
为什么这不起作用?
您的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);)是可选的,因为它将由编译器推断.
不过,若你希望MyAssember的transform方式工作只用MyValue,那么你应该这样做:
public class MyAssembler extends AbstractAssembler<MyValue> {
@Override
public void transform(MyValue value) {
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43 次 |
| 最近记录: |