抽象类 A有没有更好的解决方案?

发布于 2024-10-30 17:41:43 字数 469 浏览 2 评论 0原文

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

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

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

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

I want to override a method and replace a parameter it takes with a subclass of that parameter.

For return type there is no problem, because they are not a part of method signature and can be replaced with subclasses (called "covariant return type"). For arguments this is not working, because they are a part of signature.

So I came out with solution to use generic parameter of the same type:

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);
    ...    
  }

}

But the statement "public abstract class A" looks odd to me. Are there any other ways to achieve this? Any "covariant parameter type"? :-)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱的那么颓废 2024-11-06 17:41:43

如果它必须是参数类型,那么使用泛型可能是最好的选择。我只会做一个小的修正,以避免类声明中的原始类型:

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

If it must be a parameter type, using generics is probably the best option. I'd only do a minor correction to avoid the raw type in the class declaration:

public abstract class A<T extends A<T>> {

If however you have the special case where the object being initialized needs to be freshly created, you might include creation in a method, thereby removing the need to pass that object as parameter:

public abstract class A {
    public A clone() {

    }
}

public class B extends A {
    public B clone() {
        // copy state
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文