Подклассы подкласса (generi c) строителя - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь реализовать объект построителя с многоуровневым наследованием. Я черпал вдохновение из Подкласса Java Класс строителя , и это мой (упрощенный) код:

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 generi c имеет тип 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");
        }
    }
}

Однако я думаю, что это менее "красиво", поэтому я все равно хотел бы увидеть ответ на исходную проблему.

1 Ответ

0 голосов
/ 08 апреля 2020

Вы должны заменить public static class BuilderSubclass<T extends BuilderSubclass<T>> extends Builder<BuilderSubclass<T>> на public static class BuilderSubclass<T extends BuilderSubclass<T>> extends Builder<T>.

...