簡體   English   中英

子類化(通用)構建器的子類

[英]Subclassing a subclass of a (generic) builder

我正在嘗試使用多級 inheritance 實現構建器 object。 我從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()時,返回的 object 不是BuilderSubclassSubclass而是BuilderSubclass<BuilderSubclassSubclass> 我知道為什么會這樣: Builder的泛型類型是BuilderSubclass<BuilderSubclassSubclass> ,它在 BuilderSubclass 的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");
        }
    }
}

但是我認為這不那么“漂亮”,所以我仍然希望看到最初問題的答案。

You should replace public static class BuilderSubclass<T extends BuilderSubclass<T>> extends Builder<BuilderSubclass<T>> with public static class BuilderSubclass<T extends BuilderSubclass<T>> extends Builder<T> .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM