2011-02-04 23 views
10

मैंने निम्नलिखित सामान्य वर्ग:जावा जेनरिक संकलन त्रुटि

public class GenericClass<E,T extends Comparable<T>> 
{ 
    public static <E, T extends Comparable<T>> GenericClass<E, T> create() 
    { 
     return new GenericClass<E, T>(); 
    } 

    private GenericClass() 
    { 
    } 
} 

और यह कैसे मैं बस के लिए इसका इस्तेमाल होता है:

GenericClass<MyClass, Double> set = GenericClass.create(); 

ग्रहण संकलन कोई त्रुटि है, तथापि चलता - चींटी प्रदान करता है के साथ निर्माण निम्न त्रुटि:

MyClass.java:19: incompatible types; no instance(s) of type variable(s) E,T exist so that GenericClass<E,T> conforms to GenericClass<MyClass,java.lang.Double> 
[javac] found : <E,T>GenericClass<E,T> 
[javac] required: GenericClass<MyClass,java.lang.Double> 
[javac]    GenericClass<MyClass, Double> set = GenericClass.create(); 

धन्यवाद!

+0

और SortedSetByDoubleValue है ...? –

+0

फिक्स्ड ... मैंने सादगी – duduamar

+0

के लिए कक्षा के नाम बदल दिए हैं मेरा सुझाव स्थिर विधि बनाने और कक्षा में जेनेरिक प्रकारों के लिए समान नामों का उपयोग नहीं करना है। यद्यपि यह तकनीकी रूप से कानूनी है, लेकिन यह कुछ पागल गलतियों को स्थानांतरित करने के लिए कठिन हो सकता है। मैं पूरी तरह से() परिभाषा में ई 2 और टी 2 (या जो भी) के साथ ई, टी को प्रतिस्थापित करने का दृढ़ता से सुझाव दूंगा। उप-वर्गों के साथ सर्वोत्तम परिणामों के लिए –

उत्तर

8

इस उपयोग करके देखें:

 GenericClass<String, Double> set = GenericClass.<String,Double>create(); 

The Eclipse संकलक और javac उनके सहिष्णुता में मतभेद है।

+1

तो Google के सेट्स.न्यूशैशसेट() (उदाहरण के लिए) कैसे काम करता है? अंतर क्या है? – duduamar

+0

@duduamar: 'newHashSet()' कम जटिल है: इसका दो प्रकार के तर्कों पर कोई प्रतिबंध नहीं है। –

+0

कूल ... कुछ नया सीखा। धन्यवाद सभी – duduamar

0

आपकी अभिव्यक्ति GenericClass.create() भालू प्रकार का कोई संकेत नहीं है, इसलिए संकलक वास्तविक प्रकार के ई और टी का अनुमान नहीं लगा सकता है। आपको कंपाइलर की सहायता के लिए अपने फ़ंक्शन के प्रोटोटाइप को बदलने की आवश्यकता है।

कक्षाओं को पारित करने का सबसे आसान तरीका है।

उदाहरण:

public class GenericClass<E,T extends Comparable<T>> { 
    public static <E, T extends Comparable<T>> GenericClass<E, T> create(Class<E> e, Class<T> t) { 
     return new GenericClass<E, T>(); 
    } 

    private GenericClass() { 
    } 
} 

GenericClass<MyClass, Double> set = GenericClass.create(MyClass.class, Double.class); 
+0

कंपाइलर * प्रकार का अनुमान लगाने में सक्षम होना चाहिए। और यह संभव है (जैसा कि ग्रहण कंपाइलर स्पष्ट रूप से प्रदर्शित करता है)। मुझे समान बग मिल गई हैं जहां 'जावैक' प्रकारों का अनुमान लगाने में सक्षम नहीं था और ग्रहण कंपाइलर सक्षम था। प्रत्येक बार जब मैंने इसके लिए बग दायर की है (ग्रहण और सूर्य/ओरेकल दोनों के साथ) यह 'जावैक' बन गया जो गलती थी। –

+0

हाँ ... लेकिन जावैक संदर्भ है ;-) वैसे भी, मैंने ग्रज़गोरज़ को कुछ नया धन्यवाद सीखा। – cadrian

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