Я пытаюсь реализовать объект построителя с многоуровневым наследованием. Я черпал вдохновение из Подкласса 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");
}
}
}
Однако я думаю, что это менее "красиво", поэтому я все равно хотел бы увидеть ответ на исходную проблему.