2

我想重写一个方法并将它采用的参数替换为该参数的子类。

对于返回类型没有问题,因为它们不是方法签名的一部分,可以用子类替换(称为“协变返回类型”)。对于参数,这是行不通的,因为它们是签名的一部分。

所以我想出了使用相同类型的泛型参数的解决方案:

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”这句话在我看来很奇怪。还有其他方法可以实现这一目标吗?任何“协变参数类型”?:-)

4

1 回答 1

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
    }
}
于 2011-04-06T12:33:48.533 回答