java - 对(通用)构建器的子类进行子类化

标签 java generics builder

我正在尝试实现具有多级继承的构建器对象。我从Subclassing a Java Builder class中得到了一些灵​​感这是我的(简化的)代码:

public class StackOverflow {
    public static class Builder<T extends Builder<T>> {
        public Builder() {}

        public T doA() {
            System.out.println("A");
            return (T) this;
        }
    }

    public static class BuilderSubclass <T extends BuilderSubclass<T>> 
            extends Builder<BuilderSubclass<T>> {

        public BuilderSubclass() {}

        public T doB() {
            System.out.println("B");
            return (T) this;
        }
    }

    public static class BuilderSubclassSubclass
            extends BuilderSubclass<BuilderSubclassSubclass> {

        public BuilderSubclassSubclass() {}

        public BuilderSubclassSubclass doC() {
            System.out.println("C");
            return this;
        }
    }
}

我想做这样的事情: new StackOverflow.BuilderSubclassSubclass().doA().doC().doB()

但是,当我调用new StackOverflow.BuilderSubclassSubclass().doA()时,返回的对象不是BuilderSubclassSubclass但是一个BuilderSubclass<BuilderSubclassSubclass> 。我知道为什么会这样:Builder的通用类型是 BuilderSubclass<BuilderSubclassSubclass>它在 BuilderSubclass 的类签名中分配。

关于如何避免这个问题有什么想法吗?

更新:我想我可以避免使用构建器模式,而是调用如下函数:

StackOverflow.BuilderSubclassSubclass builder = new StackOverflow.BuilderSubclassSubclass();
builder.doA();
builder.doB();
builder.doC();

在这种情况下,代码变为:

public class StackOverflowBatchHelperFunctions {
    public static class Builder {

        public Builder() {
        }

        public void doA() {
            System.out.println("A");
        }
    }

    public static class BuilderSubclass extends Builder {
        public BuilderSubclass() {
            super();
        }

        public void doB() {
            System.out.println("B");
        }
    }

    public static class BuilderSubclassSubclass extends BuilderSubclass {
        public BuilderSubclassSubclass() {
            super();
        }

        public void doC() {
            System.out.println("C");
        }
    }
}

但是我认为这不太“漂亮”,所以我仍然希望看到最初问题的答案。

最佳答案

您应该替换public static class BuilderSubclass<T extends BuilderSubclass<T>> extends Builder<BuilderSubclass<T>>public static class BuilderSubclass<T extends BuilderSubclass<T>> extends Builder<T> .

关于java - 对(通用)构建器的子类进行子类化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61094648/

相关文章:

具有 getSize().width、getSize().height 的 Java 小程序

java - 如何使弹跳球与处理中的矩形数组碰撞?

c# - 将 ComponentRegistration 向下转换为非泛型类型

java - 如何将泛型传递到此方法中

php - Laravel 的查询构建器有什么好处?

java - 构造不可变对象(immutable对象)的抽象生成器

java - Couchbase:(Java)ORDER BY 子句的参数化查询不起作用

java - 如何在 Kotlin 中初始化一个线程?

java - 如何返回继承类的Vector?

没有内部类的 PHP Builder 模式