我試圖用許多參數創建一個類,使用Builder模式而不是伸縮構造函數。我按照Joshua Bloch的Effective Java描述的方式進行操作,在封閉類上有私有構造函數,還有一個公共靜態生成器類。在調用build()之前,Builder類確保對象處於一致狀態,此時它將封閉對象的構造委託給私有構造函數。因此,具有泛型類型邊界的Java生成器模式
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>
但,但它仍然是由編譯器所接受。
我在這裏做錯了什麼?我想在編譯時確保單元類型正確匹配。
謝謝你,我沒有想到的很清楚這方面。 – I82Much 2010-05-17 22:39:37