Я знаком с использованием шаблона построителя с обобщениями и подклассами, но я не понимаю, как заставить его работать с нетривиальным деревом подклассов (т. Е. C расширяет B расширяет A).Вот простой пример того, что я пытаюсь сделать:
class A {
private final int value;
protected A(ABuilder builder) {
this.value = builder.value;
}
public int getValue() { return value; }
public static class ABuilder<T extends ABuilder<T>> {
private int value;
public T withValue(int value) {
this.value = value;
return (T) this;
}
public A build() {
return new A(this);
}
}
}
class B extends A {
private final String name;
public static BBuilder builder() {
return new BBuilder();
}
protected B(BBuilder builder) {
super(builder);
this.name = builder.name;
}
public String getName() { return name; }
public static class BBuilder<U extends BBuilder<U>> extends ABuilder<BBuilder<U>> {
private String name;
public U withName(String name) {
this.name = name;
return (U) this;
}
public B build() {
return new B(this);
}
}
}
Все нормально, если я объявляю BBuilder без универсального типа:
public static class BBuilder extends ABuilder<BBuilder>
Поскольку я хочу, чтобы BBuilder был расширенCBuilder, я пытаюсь использовать тот же тип шаблона CURLYURURRING Template Pattern, что и ABuilder.Но вот так, компилятор видит BBuilder.withValue () как возвращающий ABuilder, а не BBuilder, как я хочу.Это:
B b = builder.withValue(1)
.withName("X")
.build();
не компилируется.Может кто-нибудь увидеть, что я делаю здесь не так, я пробовал разные образцы дженериков, но не могу заставить его работать.
Спасибо всем, кто имеет какие-либо советы.