抽象类A <t extends =“”a =“”>?</t>有更好的解决方案吗?

时间:2011-04-06 11:57:18

标签: java covariant

我想覆盖一个方法,并用该参数的子类替换它所参数。

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

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

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

1 个答案:

答案 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
    }
}