当前位置: 首页 > 知识库问答 >
问题:

继承和静态嵌套Java类

阚吕恭
2023-03-14

我正在用Java建模,并使用构建器模式。在许多情况下,一些共同成员是在父级中定义的,而其他成员则是在从父级继承的子级上定义的。一个例子如下:

public class Parent {
    private Integer age;

    static class ParentBuilder {
        private Integer age;

        public ParentBuilder age(Integer age) {
            this.age = age;
            return this;
        }
    }
}
public class Child extends Parent {

    private Integer height;

    static class ChildBuilder extends Parent.ParentBuilder {
        private Integer height;

        public ChildBuilder height(Integer height) {
            this.height = height;
            return this;
        }

        public Child build() {
            return new Child(this);
        }
    }

    public static ChildBuilder builder() {
        return new ChildBuilder();
    }

    public Child(ChildBuilder b) {
        this.height = b.height;
    }
}
Child child = Child.builder()
    .age(18)
    .height(150)
    .build();
Main.java:6: error: cannot find symbol
        .height(150)
        ^
symbol:   method height(int)
location: class ParentBuilder

如果删除.height(150),则在.build()上得到相同的错误。看来我对静态嵌套类的继承有一个根本的误解。

为什么当child.builder()返回childbuilder时,编译器会抱怨方法不在parentbuilder中?有没有一种方法可以像我所尝试的那样,利用继承和这个构建器模式,允许在父级中定义公共成员,在子级中定义其他成员?

共有1个答案

章兴发
2023-03-14

您可以使它与泛型一起工作

static class ParentBuilder<B extends ParentBuilder<B>> {
    public B age(Integer age) {
        this.age = age;
        return (B) this;
    }
}

static class ChildBuilder extends Parent.ParentBuilder<ChildBuilder> {
    private Integer height;

    public ChildBuilder height(Integer height) {
        this.height = height;
        return this;
    }

    public Child build() {
        return new Child(this);
    }
}

这样age将返回childbuilderchildbuilder

 类似资料:
  • 问题内容: 假设我有以下课程: 以及这两个子类: 和 我的问题是这两个子类从父类共享相同的静态curID成员,而不是拥有不同的成员。 所以,如果我这样做: r1,r2,r3的ID为0,1,2,而t1,t2,t3的ID为3,4,5。除了这些,我希望t1,t2,t3的值分别为0、1、2,即使用curID静态变量的另一个副本。 这可能吗?如何? 问题答案: 正如其他人已经写过的,静态成员已绑定到该类,因

  • 问题内容: 我很难用Java的非静态嵌套类来解决问题。考虑以下示例,该示例先显示“ Inner”,然后显示“ Child”。 我知道Inner实例始终必须与Outer实例相关联,这也适用于Child,因为它扩展了Inner。我的问题是语法的含义- 为什么调用内部构造函数? 我只看到一个用于调用超类构造函数和调用重写方法的超类版本的纯文本,但从未使用过这种形式。 问题答案: 这称为“合格的超类构造函

  • 问题内容: 我不太明白为什么可以在Java中继承静态方法? 继承就像从基类继承,而Static属于Class而不是Object。 那么,如果静态仅属于该类,为什么它会滴入派生类呢?它不应该只与定义它的类一起使用吗? 继承静态方法是一种好的编程习惯吗? 问题答案: 在Java中,静态方法不是 继承的 (或正确的词被 覆盖 ),但可以 隐藏 。 这里最大的不同是它们不像对象方法那样经受多态性。 运行时

  • 和这个问题相关的课程: 现在,这似乎已被编译器接受。不幸的是,我不知道/理解如何创建的新实例,。 当然,这确实不起作用:

  • 假设我有以下课程: 这两个子类: 和 我的问题是,这两个子类共享来自父类的同一个静态curID成员,而不是拥有不同的成员。 因此,如果我这样做: r1,r2,r3的ID是0,1,2,t1,t2,t3的ID是3,4,5。而不是这些我希望t1,t2,t3有值0,1,2,即使用另一个复制的curID静态变量。 这有可能吗?怎么做?

  • 问题内容: 我想要以下设置: 这在Java中可能吗?怎么样?如果可以避免的话,我宁愿不使用实例变量/方法。 谢谢! 编辑: 常量是数据库表的名称。每个子对象都是一个微型ORM。 问题答案: 您无法完全按照自己的意愿去做。也许可以接受的折衷方案是: