2010-01-17 2 views
34

सबसे पहले मुझे केवल जावा मूलभूत जानकारी है।जावा में जेनेरिक प्रकारों पर बाधाओं को कैसे सेट करें?

ListObject<MyClass> foo = new ListObject<MyClass>(); 
ListObject<MyClass> foo2 = new ListObject<MyClass>(); 
foo.compareTo(foo2); 

समस्या है, मैं कैसे परिभाषित कर सकते हैं:

public class ListObject<T> 
{ 
    // fields 
    protected T _Value = null; 
     // .. 
} 

अब मैं जैसे निम्नलिखित कुछ करना चाहता हूँ:

मैं एक सामान्य वर्ग है: अब मैं इस परिदृश्य पर है .compareTo() विधि जबकि टी सामान्य है? मुझे लगता है कि जेनेरिक टी पर एक बाधा को लागू करने के लिए मुझे किसी भी तरह का कहना है कि टी एक विशिष्ट इंटरफ़ेस लागू करता है (शायद तुलनात्मक, यदि वह मौजूद है)।

क्या कोई मुझे एक छोटा कोड नमूना प्रदान कर सकता है?

उत्तर

41

पढ़ें भी यहाँ चर्चा: Generics and sorting in Java

कम जवाब है, सबसे अच्छा आप प्राप्त कर सकते है:

012,
class ListObject<T extends Comparable<? super T>> { 
    ... 
} 

लेकिन कुछ ऐसे कारण है बस का उपयोग करें:

class ListObject<T extends Comparable> { 
    ... 
} 
+1

नहीं है, मैं इस समय के लिए ListObject विस्तारित करता हूं। – citronas

+3

संबंधित धागा भी देखें: http://stackoverflow.com/questions/2064169/what-does-this-class-declaration-mean-in-java/2072820, जो फॉर्म के वाइल्डकार्ड की आवश्यकता पर चर्चा करता है: sateesh

2

public class ListObject<T extends U> आज़माएं। केवल T एस जो U लागू करते हैं (या U से प्राप्त होते हैं) स्वीकार्य प्रतिस्थापन होंगे।

+0

मुझे एक संकलक त्रुटि देता है। यहां तक ​​कि इस तरह के एक सरल TestClass साथ: सार्वजनिक वर्ग ConstraintTest {} सिंटेक्स टोकन "औजार" पर त्रुटि <टी तुलनीय लागू करता है> ,, अपेक्षित मैं क्या याद आ रही है? – citronas

+0

@citronas: यह वास्तव में इंटरफेस के लिए भी 'विस्तारित' है। ध्यान दें कि यदि आप 'विस्तारित 'विशेषता के साथ बेस क्लास का उपयोग करते हैं, तो आप वास्तव में जेनरेटेड ऑब्जेक्ट पर सीधे बेस क्लास जोड़ सकते हैं, यह जेनेरिक एक्सटेंशन का सबसे बड़ा * (और सबसे खराब) * साइड इफेक्ट है। – Esko

+0

हूप्स। मेरा बुरा, पकड़ने के लिए धन्यवाद, @Esko। –

-2
public class ListObject<T implements Comparable> {...} 
+4

-1 वोट दिया गया है क्योंकि प्रकार पैरामीटर के बिना तुलनात्मक कच्चा प्रकार है जिसे आपको जावा 1.5+ – helpermethod

+2

के साथ उपयोग नहीं करना चाहिए यह वैध वाक्यविन्यास – newacct

4

यह इस बात पर निर्भर करता है कि आप तुलना करने के लिए क्या करना चाहते हैं। सीधे शब्दों में compareTo विधि को परिभाषित अन्य ListObject<T> मान निम्न

public class ListObject<T> { 
    public int compareTo(ListObject<T> other) { 
    ... 
    } 
} 

लेकिन अगर आप वास्तव में उस पैरामीटर पर तरीकों कॉल करने के लिए आप कुछ बाधाओं को जोड़ने के लिए की तरह T मूल्य के बारे में अधिक जानकारी देने के लिए की आवश्यकता होगी चाहते द्वारा किया जाता है लेने के लिए इसलिए

class ListObject<T extends Comparable<T>> { 
    ... 
}