Tôi đang cố gắng tạo một lớp có nhiều tham số, sử dụng mẫu Builder hơn là các nhà xây dựng lồng ghép. Tôi đang làm điều này theo cách được mô tả bởi Java hiệu quả của Joshua Bloch, có hàm tạo riêng tư trên lớp kèm theo, và một lớp Trình dựng tĩnh công cộng. Lớp Builder đảm bảo đối tượng ở trạng thái nhất quán trước khi gọi build(), tại thời điểm đó nó ủy nhiệm việc xây dựng đối tượng kèm theo cho hàm tạo riêng. Do đó,Mô hình Java Builder với các giới hạn kiểu chung
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);
}
}
}
Sau đó, tôi muốn thêm các giới hạn kiểu vào một số biến và do đó cần tham số định nghĩa lớp. Tôi muốn giới hạn của lớp Foo giống như lớp 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);
}
}
}
Điều này biên dịch tốt, nhưng trình biên dịch cho phép tôi làm những điều tôi cảm thấy là lỗi trình biên dịch. Ví dụ.
public static final Foo.Builder<Acceleration> x_Body_AccelField =
new Foo.Builder<Acceleration>()
.units(SI.METER)
.build();
đây đối số đơn vị không phải là Unit<Acceleration>
nhưng Unit<Length>
, nhưng nó vẫn được chấp nhận bởi trình biên dịch.
Tôi đang làm gì sai ở đây? Tôi muốn đảm bảo thời gian biên dịch các loại đơn vị khớp đúng.
Cảm ơn bạn, tôi đã không suy nghĩ rất rõ ràng trong vấn đề đó. – I82Much