我想覆盖一个方法,并用该参数的子类替换它所参数。
对于返回类型没有问题,因为它们不是方法签名的一部分,可以用子类替换(称为“协变返回类型”)。对于论证,这不起作用,因为它们是签名的一部分。
所以我提出了使用相同类型的通用参数的解决方案:
public abstract class A<T extends A> {
public void loadValuesFrom(T source) {
...
}
}
public class B extends A<B> {
public void loadValuesFrom(B source) {
super.loadValuesFrom(source);
...
}
}
但声明“公共抽象类A”对我来说很奇怪。有没有其他方法可以实现这一目标?任何“协变参数类型”? : - )
答案 0 :(得分:1)
如果它必须是参数类型,则使用泛型可能是最佳选择。我只做了一个小修正,以避免类声明中的原始类型:
public abstract class A<T extends A<T>> {
但是,如果您有特殊情况需要新创建初始化对象,则可以在方法中包含创建,从而无需将该对象作为参数传递:
public abstract class A {
public A clone() {
}
}
public class B extends A {
public B clone() {
// copy state
}
}