2010-05-17 16 views
5

मैं टेलीस्कोपिंग कन्स्ट्रक्टर के बजाय बिल्डर पैटर्न का उपयोग करके कई पैरामीटर के साथ कक्षा बनाने का प्रयास कर रहा हूं। मैं यह जोशुआ ब्लोच के प्रभावी जावा द्वारा वर्णित तरीके से कर रहा हूं, जिसमें संलग्न वर्ग पर निजी कन्स्ट्रक्टर है, और एक सार्वजनिक स्थैतिक बिल्डर वर्ग है। बिल्डर वर्ग यह सुनिश्चित करता है कि ऑब्जेक्ट बिल्ड() को कॉल करने से पहले एक स्थिर स्थिति में है, जिस बिंदु पर यह निजी कन्स्ट्रक्टर को संलग्न वस्तु के निर्माण का प्रतिनिधित्व करता है। इस प्रकारजेनेरिक प्रकार सीमाओं के साथ जावा बिल्डर पैटर्न

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> नहीं है, लेकिन यह अभी भी संकलक द्वारा स्वीकार किया जाता है।

क्या मैं गलत यहाँ कर रहा हूँ? मैं समय संकलित करने के लिए सुनिश्चित करना चाहता हूं कि इकाई प्रकार सही ढंग से मेल खाते हैं।

उत्तर

6

unitsBuilder<Q> वापस लौटा देना चाहिए, एक 0gनहीं।

+0

धन्यवाद, मैं बहुत स्पष्ट रूप से सोच नहीं किया गया था उस संबंध में। – I82Much

0

हालांकि @ डैनियल का बिंदु मान्य है, फिर भी आपके कोड में त्रुटि कम से कम एक्लिप्स द्वारा देखी गई है।

interface Quantity { 
} 
class Acceleration implements Quantity { 
} 
class Length implements Quantity { 
} 
public class Unit<Q extends Quantity> { 
    public static final Unit<Length> METER = new Unit<Length>(); 
} 

public static final Foo.Builder<Acceleration> x_Body_AccelField = 
    new Foo.Builder<Acceleration>() 
    .units(Unit.METER) // here the compiler complains 
    .build(); 

त्रुटि संदेश है: बेशक, Quantity, Unit और METER की अपनी परिभाषा शायद सरलीकृत हैक मैं एक साथ रखा से अलग है

The method units(Unit<Acceleration>) in the type Foo.Builder<Acceleration> is 
not applicable for the arguments (Unit<Length>) 
+0

दिलचस्प। मैं नेटबीन का उपयोग कर रहा था, जिसने शिकायत नहीं की थी। यूनिट आदि पदानुक्रम जिसका उपयोग मैं कर रहा हूं जेएसआर 275 (http://download.java.net/maven/2/net/java/dev/jsr-275/jsr-275/1.0-beta-2/) और JScience से आ रहा है (http://jscience.org/) – I82Much

+2

आपको नेटबीन में भी यह त्रुटि मिलनी चाहिए ... यदि नहीं, तो यह एक बहुत ही खराब बग है। आपके मूल कोड में अंतर यह है कि यदि आपके पास मध्यवर्ती संपत्ति है: नया Foo.builder <त्वरण>()। पनीर (GOUDA) .units (Unit.METER), जहां 'पनीर' विधि बिल्डर नहीं बिल्डर देता है। – Cowan

संबंधित मुद्दे