मैं टेलीस्कोपिंग कन्स्ट्रक्टर के बजाय बिल्डर पैटर्न का उपयोग करके कई पैरामीटर के साथ कक्षा बनाने का प्रयास कर रहा हूं। मैं यह जोशुआ ब्लोच के प्रभावी जावा द्वारा वर्णित तरीके से कर रहा हूं, जिसमें संलग्न वर्ग पर निजी कन्स्ट्रक्टर है, और एक सार्वजनिक स्थैतिक बिल्डर वर्ग है। बिल्डर वर्ग यह सुनिश्चित करता है कि ऑब्जेक्ट बिल्ड() को कॉल करने से पहले एक स्थिर स्थिति में है, जिस बिंदु पर यह निजी कन्स्ट्रक्टर को संलग्न वस्तु के निर्माण का प्रतिनिधित्व करता है। इस प्रकारजेनेरिक प्रकार सीमाओं के साथ जावा बिल्डर पैटर्न
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);
}
}
}
मैं फिर कुछ चरों में टाइप सीमा जोड़ना चाहता हूं, और इस प्रकार कक्षा परिभाषा को पैरामीट्रिज़ करने की आवश्यकता है। मैं चाहता हूं कि फू क्लास की सीमाएं बिल्डर वर्ग की तरह हों।
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>
नहीं है, लेकिन यह अभी भी संकलक द्वारा स्वीकार किया जाता है।
क्या मैं गलत यहाँ कर रहा हूँ? मैं समय संकलित करने के लिए सुनिश्चित करना चाहता हूं कि इकाई प्रकार सही ढंग से मेल खाते हैं।
धन्यवाद, मैं बहुत स्पष्ट रूप से सोच नहीं किया गया था उस संबंध में। – I82Much