首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java:在超类方法签名中返回子类

Java:在超类方法签名中返回子类
EN

Stack Overflow用户
提问于 2012-06-10 20:08:58
回答 3查看 16.3K关注 0票数 27

我正在解决一个问题,其中有几个Foo实现,并伴随着几个FooBuilder。虽然Foo共享几个需要设置的公共变量,但它们也有不同的变量,这些变量需要各自的FooBuilder来实现一些特定的功能。为了简洁,我希望FooBuilder的setter使用方法链接,例如:

代码语言:javascript
复制
public abstract class FooBuilder {
  ...

  public FooBuilder setA(int A) {
    this.A = A;
    return this;
  }

  ...
}

代码语言:javascript
复制
public class FooImplBuilder extends FooBuilder{
  ...
  public FooImplBuilder setB(int B) {
    this.B = B;
    return this;
  }
  public FooImplBuilder setC(int C) {
    this.C = C;
    return this;
  }
  ...
}

以此类推,使用几种不同的FooBuilder实现。这在技术上做了我想要的一切,然而,当执行方法链接时,这种方法对方法调用的顺序很敏感。以下代码具有未定义的方法编译错误:

代码语言:javascript
复制
someFoo.setA(a).setB(b)...

要求开发人员考虑链中方法调用的顺序。为了避免这种情况,我希望FooBuilder中的设置器以某种方式返回实际实现的子类。然而,我不确定如何做到这一点。最好的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-10 21:40:58

这是一个很好的问题,也是一个真正的问题。

在Java中处理它的最简单的方法可能涉及到泛型的使用,正如Jochen的回答中提到的那样。

Using Inheritance with Fluent Interfaces上的这篇博客文章中,对这个问题进行了很好的讨论,并提出了一个合理的解决方案,它将泛型与构建器子类中覆盖的getThis()方法的定义结合起来,以解决总是返回正确类的构建器的问题。

票数 20
EN

Stack Overflow用户

发布于 2017-03-02 03:05:02

在找到this excellent answer之后,我现在将它分享给大家。

代码语言:javascript
复制
public class SuperClass<I extends SuperClass>
{
    @SuppressWarnings( "unchecked" ) // If you're annoyed by Lint.
    public I doStuff( Object withThings )
    {
        // Do stuff with things.
        return (I)this ; // Will always cast to the subclass. Causes the Lint warning.
    }
}

public class ImplementationOne
extends SuperClass<ImplementationOne>
{} // doStuff() will return an instance of ImplementationOne

public class ImplementationTwo
extends SuperClass<ImplementationTwo>
{} // doStuff() will return an instance of ImplementationTwo
票数 9
EN

Stack Overflow用户

发布于 2012-06-10 20:18:55

泛型可能是解决这个问题的方法。

如果你声明setA(),就像这样(伪代码)

代码语言:javascript
复制
<T> T setA(int a)

编译器应该能够找出真正的类型,如果不能,你可以在代码中给出提示,比如

代码语言:javascript
复制
obj.<RealFoo>setA(42)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10968557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档