2011-01-28 24 views
18

मैं जावा में एक साधारण अभ्यास के रूप में एक क्रमबद्ध सूची को लागू करने की कोशिश कर रहा हूं। इसे सामान्य बनाने के लिए मेरे पास add(Comparable obj) है, इसलिए मैं इसे किसी भी वर्ग के साथ उपयोग कर सकता हूं जो तुलनात्मक इंटरफ़ेस लागू करता है।जावा "कच्चे प्रकार के सदस्य के रूप में तुलना करने के लिए अनचेक कॉल (टी) कच्चे प्रकार java.lang.Comparable"

लेकिन, जब मैं कोड में कहीं भी obj.compareTo(...) का उपयोग करता हूं तो मुझे संकलक से "unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable" मिलता है (-Xlint:unchecked विकल्प के साथ)। कोड ठीक काम करता है लेकिन मैं यह नहीं समझ सकता कि उस परेशान संदेश से कैसे छुटकारा पाएं।

कोई संकेत?

उत्तर

22

संक्षेप में, इस चेतावनी का कहना है कि Comparable वस्तु मनमाने ढंग से वस्तुओं की तुलना नहीं की जा सकती। Comparable<T> एक सामान्य इंटरफ़ेस है, जहां टाइप पैरामीटर T ऑब्जेक्ट के प्रकार को निर्दिष्ट करता है जिस पर इस ऑब्जेक्ट की तुलना की जा सकती है।

public class SortedList<T extends Comparable<? super T>> { 
    public void add(T obj) { ... } 
    ... 
} 
+4

होना चाहिए 'टी तुलनीय फैली '। – ColinD

+0

ठीक है, मैंने इसे आजमाया क्योंकि यह पहले था और यह काम करता था। – 3mpty

1

तुम इतनी तरह "जाँच" करने के लिए या परिभाषित तुलनीय वस्तु की जरूरत है:

add(Comparable<Object> obj) 
9

:

तो, क्रम Comparable<T> सही ढंग से उपयोग करने के लिए, आप अपने अनुसार क्रमबद्ध सूची सामान्य बनाने के लिए, एक बाधा है कि अपनी सूची वस्तुओं है कि एक दूसरे से तुलना की जा सकती संग्रहीत करता है, कुछ इस तरह व्यक्त करने के लिए की जरूरत है एक विधि पैरामीटर के रूप में Comparable जैसे इंटरफेस का उपयोग करने से आपकी कक्षा जेनेरिक नहीं होती है, जेनेरिक टाइप पैरामीटर घोषित और उपयोग करना यह है कि आप इसे सामान्य कैसे बनाते हैं।

त्वरित-एन-गंदा जवाब: आप चेतावनी प्राप्त कर रहे हैं क्योंकि आप Comparable उपयोग कर रहे हैं, जो एक सामान्य इंटरफ़ेस, एक कच्चे प्रकार के रूप में, बजाय यह एक विशेष प्रकार का तर्क दे रही है, Comparable<String> की तरह।

इसे ठीक करने के add() प्रकार पैरामीटर निर्दिष्ट द्वारा सामान्य बनाने:

<T extends Comparable<? super T>> add(T obj) { ... } 

लेकिन इस त्वरित सुधार सामान्य समस्या यह है कि अपने वर्ग असुरक्षित है ठीक नहीं होगा। आखिरकार, आपकी सूची में सभी वस्तुओं को एक ही प्रकार का नहीं होना चाहिए? यह add विधि आपको एक ही सूची में अभी भी अलग-अलग प्रकार की सुविधा देता है। क्या होता है जब आप विषम प्रकारों की तुलना करने का प्रयास करते हैं (आप compareToObject उदाहरण Number उदाहरण, या स्ट्रिंग उदाहरण के लिए कैसे करते हैं)? आप सही काम करने के लिए कक्षा के उपयोगकर्ता पर निर्भर कर सकते हैं और सुनिश्चित कर सकते हैं कि वे आपकी सूची में केवल 1 प्रकार की चीज चिपके रहें, लेकिन एक सामान्य वर्ग संकलक को इस नियम को लागू करने देगा।

बेहतर दृष्टिकोण: उचित ठीक है कि आपके अनुसार क्रमबद्ध सूची वर्ग शायद सामान्य समग्र हो जाना चाहिए, बस java.util में अन्य संग्रह वर्गों की तरह है।

आप होगा शायद की तरह कुछ की तरह:

public class SortedList<T extends Comparable<? super T>> 
implements Iterable<T> { 
    ... 
    public void add(T item) { ... } 
    public Iterator<T> iterator() { ... } 
    ... 
} 

ध्यान दें कि जब वर्ग सामान्य है, add विधि वर्गों औपचारिक प्रकार पैरामीटर बल्कि अपनी ही औपचारिक प्रकार पैरामीटर की घोषणा से उपयोग करता है।

कैसे एक सामान्य वर्ग बनाने के लिए पर वेब पर ट्यूटोरियल बहुत सारे होना चाहिए, लेकिन यहाँ एक त्वरित उदाहरण है:

http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ002

class Pair<X,Y> { 
    private X first; 
    private Y second; 
    public Pair(X a1, Y a2) { 
    first = a1; 
    second = a2; 
    } 
    public X getFirst() { return first; } 
    public Y getSecond() { return second; } 
    public void setFirst(X arg) { first = arg; } 
    public void setSecond(Y arg) { second = arg; } 
}