用泛型覆盖
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);
) 是可选的,因为它将由编译器推断。
如果您希望 MyAssember
的 transform
方法 仅 与 MyValue
一起工作,那么您应该这样做:
public class MyAssembler extends AbstractAssembler<MyValue> {
@Override
public void transform(MyValue value) {
}
}
考虑以下摘要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);
) 是可选的,因为它将由编译器推断。
如果您希望 MyAssember
的 transform
方法 仅 与 MyValue
一起工作,那么您应该这样做:
public class MyAssembler extends AbstractAssembler<MyValue> {
@Override
public void transform(MyValue value) {
}
}