2011-11-29 6 views
5

मैं एक सामान्य जावा वर्ग है कि दुकानों comparables:जेनेरिक जावा वर्ग है कि संग्रहीत करता comparables

public class MyGenericStorage<T extends Comparable<T>> { 
    private T value; 

    public MyGenericStorage(T value) { 
     this.value = value; 
    } 

    //... methods that use T.compareTo() 
} 

मैं भी व्यक्ति कहा जाता है एक अमूर्त वर्ग है:

public abstract class Person implements Comparable<Person> 

और दो ठोस उपवर्गों, प्रोफेसर और छात्र :

public class Professor extends Person 
public class Student extends Person 

अब जब मैं एक MyGenericStorage बनाना चाहता हूं, तो मुझे एक त्रुटि मिलती है:

//error: type argument Student is not within bounds of type-variable T 
MyGenericStorage<Student> studStore = new MyGenericStorage<Student>(new Student()); 

//this works: 
MyGenericStorage<Person> persStore = new MyGenericStorage<Person>(new Student()); 

मुझे लगता है कि ऐसा इसलिए है क्योंकि मुझे जेनेरिक समझने में मौलिक समस्या है। क्या कोई मुझे यह समझा सकता है, और यह भी, इसे कैसे ठीक किया जाए?

संपादित करें:

मैं निम्नलिखित करने के लिए MyGenericStorage बदल गए हैं:

public class MyGenericStorage<T extends Comparable<? super T>> 

और अब यह काम करने के लिए लगता है। क्या कोई समझा सकता है क्यों?

+0

क्या होगा यदि आप इसे 'पब्लिक क्लास में बदलते हैं तो छात्र व्यक्ति के लागू करता है तुलनात्मक '? –

उत्तर

6

आप MyGenericStorage के लिए निम्नलिखित घोषणा के साथ इसे ठीक कर सकते हैं:

class MyGenericStorage<T extends Comparable<? super T>> { … 

इसका मतलब है कि T एक Comparable कार्यान्वयन कि T के कुछ महाप्रकार स्वीकार करता है होना आवश्यक है। Student और Professor के मामले में, बाउंड (?) द्वारा प्रतिनिधित्व किए गए सुपरटेप Person है।


अपडेट: "अब यह काम करने के लिए कोई व्याख्या कर सकते हैं क्यों लगता है।?"

ठीक है, मैंने अपने मूल उत्तर में कोशिश की, लेकिन मुझे इसे एक और शॉट देने दो।

? super T का अर्थ है "टी का कुछ सुपरटेप"। मान लीजिए कि इस मामले में T छात्र है।इसलिए, छात्र को "छात्र के कुछ सुपरटेप के लिए" लागू करना चाहिए "

StudentPerson बढ़ाता है, जो Comparable<Person> लागू करता है। इसलिए, छात्र वास्तव में "छात्र के कुछ सुपरटेप के लिए तुलनात्मक" लागू करता है।

यदि आपके पास जावा जेनरिक के बारे में कोई प्रश्न है, तो शुरू करने के लिए सबसे अच्छी जगह Angelika Langer's FAQ. है इस मामले में, the entry about bounded wild-cards सहायक हो सकता है।

+0

स्पष्टीकरण के लिए आपको बहुत बहुत धन्यवाद, जब मैंने प्रश्न संपादित किया था तब मैंने आपका जवाब नहीं देखा :-) – avf

5

आपका समस्या यह है कि Person फैली Comparable<Person> है, इसलिए यह ठीक है, लेकिन Student व्यक्ति प्रदान करता है और इस प्रकार यह Comparable<Person> नहीं Comparable<Student> फैली हुई है।

आपकी बाधा में आप <T extends Comparable<T>> कह रहे हैं, इस प्रकार वे सटीक उसी प्रकार होना चाहिए। व्युत्पन्न प्रकार स्वीकार्य नहीं हैं

1
public class MyGenericStorage<T extends Comparable<T>> 

उपर्युक्त के लिए आपको सामान्य वर्ग को दिए गए प्रकार को एक वर्ग का विस्तार करने के लिए आवश्यक है जो स्वयं के साथ अतुलनीय है। संक्षेप में, आप कह रहे हैं कि Person को Comparable<Student> और Comparable<Professor> लागू करना होगा। यही कारण है कि इसका इस्तेमाल नहीं किया जा सकता है।

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