我试图用许多参数创建一个类,使用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