当前位置: 首页 > 面试题库 >

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

韩玉石
2023-03-14
问题内容

我正在研究存在的多个实现以及Foo多个FooBuilder的问题。尽管Foo共有几个需要设置的通用变量,但它们也有不同的变量,需要它们各自FooBuilder实现某些特定功能。为了简洁起见,我想让FooBuildersetter使用方法链接,例如:

public abstract class FooBuilder {
  ...

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

  ...
}

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实现。从技术上讲,这可以完成我想要的一切,但是,这种方法对执行方法链接时的方法调用顺序很敏感。以下是方法未定义的编译错误:

someFoo.setA(a).setB(b)...

要求开发人员考虑链中方法调用的顺序。为了避免这种情况,我想让设置器以FooBuilder某种方式返回实际的实现子类。但是,我不确定如何执行此操作。最好的方法是什么?


问题答案:

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

如Jochen的回答所述,用Java处理它的最简单方法可能涉及使用泛型。

在关于使用继承与Fluent Interfaces的博客文章中,对该问题进行了很好的讨论,并找到了合理的解决方案,该文章将泛型与getThis()构建器子类中重写的方法的定义结合在一起,以解决始终返回正确类的构建器的问题。



 类似资料:
  • Java类/接口中的方法签名是否包含其返回类型? 例子: Java是否知道这两种方法之间的区别: 或者可能只有方法名和参数列表才重要?

  • 问题内容: 从子类对象调用该方法时,是否有任何优雅的方法可以使位于父类中的Java方法返回子类的对象? 我想在不使用其他接口和方法的情况下实现此功能,并在没有类强制转换,辅助参数等的情况下使用此功能。 更新: 抱歉,我不太清楚。 我想实现方法链,但是父类的方法存在问题:调用父类方法时,我无法访问子类方法… 我想我已经提出了我的想法的核心。 因此,方法应返回类的对象。 问题答案: 如果您只是在寻找针

  • 如果我有以下代码 首先,这甚至是可能的,因为它编译得很好。但是我不能使用中的方法执行操作: makeCan是否不同时返回Can和PromotionalCan?如果是这样,当返回PromotionalCan时,如何对变量进行操作?谢谢 编辑:PromotionalCan继承自Can,第二种方法是在PromotionalCan中

  • 问题内容: 我对Java中的多态性有基本的疑问。我已经在一个名为AnimalTestDrive.java的文件中编写了以下代码。根据我的说法,以下代码应专门以粗体显示该行,但不幸的是,它不能。您能否解释为什么,我给出了以下错误: 问题答案: 让我们尝试以与编译器相同的方式查看此行: 首先,它需要弄清楚是什么意思。很好而且很容易-它是当前方法中的局部变量,因此它不需要花很多时间。 该变量的编译时类型

  • 我对Java/Android中的继承/接口有点困惑,不确定我是否走上了正确的道路。基本上,我在Android系统中使用Parcelable,由于方法未定义,所以会出现错误。 我有一个动物超类和几个子类(狗、猫等)。在第一个活动中,您选择一只动物,然后它将其打包并传递给第二个活动: 问题是“updateImage”只存在于子类中,因此它不会在这里编译。我不希望这个方法出现在超类中,因为输出根据动物的

  • 问题内容: 我正在学习Java入门课程,我们才刚刚开始学习继承。我正在完成一项任务,要求我们创建一个具有名称和年龄的“宠物”超类。和三个子类,每个子类都有自己的独特特征(我选择了“狗”,“猫”和“鸟”)。构建完所有这些之后,我们将创建一个Main类来测试所有内容,这就是我遇到问题的地方。我试图在中调用这些独特特征的方法,但似乎只能找到超类中的方法。 这是主类: 这是我的超人 这是子类之一(它们看起