Опитвам се да създам клас с много параметри, като използвам модел на Builder, а не телескопични конструктори. Правя това по начина, описан от Ефективната Java на Джошуа Блох, като имам частен конструктор в обграждащия клас и публичен статичен клас Builder. Класът Builder гарантира, че обектът е в последователно състояние, преди да извика build(), в който момент делегира конструкцията на обхващащия обект на частния конструктор. По този начин
public class Foo {
// Many variables
private Foo(Builder b) {
// Use all of b's variables to initialize self
}
public static final class Builder {
public Builder(/* required variables */) {
}
public Builder var1(Var var) {
// set it
return this;
}
public Foo build() {
return new Foo(this);
}
}
}
След това искам да добавя граници на типа към някои от променливите и по този начин трябва да параметризирам дефиницията на класа. Искам границите на класа Foo да бъдат същите като тези на класа Builder.
public class Foo<Q extends Quantity> {
private final Unit<Q> units;
// Many variables
private Foo(Builder<Q> b) {
// Use all of b's variables to initialize self
}
public static final class Builder<Q extends Quantity> {
private Unit<Q> units;
public Builder(/* required variables */) {
}
public Builder units(Unit<Q> units) {
this.units = units;
return this;
}
public Foo build() {
return new Foo<Q>(this);
}
}
}
Това се компилира добре, но компилаторът ми позволява да правя неща, които смятам, че трябва да са грешки на компилатора. напр.
public static final Foo.Builder<Acceleration> x_Body_AccelField =
new Foo.Builder<Acceleration>()
.units(SI.METER)
.build();
Тук аргументът единици не е Unit<Acceleration>
, а Unit<Length>
, но все пак се приема от компилатора.
Какво правя грешно тук? Искам да се уверя по време на компилиране, че типовете единици съвпадат правилно.