2010-01-15 13 views
13

मान लीजिए कि आप सरणी को सॉर्ट करने के लिए जावा में एक स्थिर फ़ंक्शन लिखते हैं, Arrays.sort() की तरह। Arrays.sort() के साथ समस्या यह है कि यह ऑब्जेक्ट की एक सरणी प्राप्त करता है, और ClassCastException फेंकता है यदि उसके तत्व Comparable लागू नहीं करते हैं।जावा में जेनिक्स और सॉर्टिंग

तो आप चाहते हैं कि आपका कार्य Comparable के उप-प्रकार की एक सरणी के रूप में प्राप्त हो। ऐसा ही कुछ काम कर सकता था:

static <T extends Comparable> void sort(T[] array); 

कि हस्ताक्षर के साथ समस्या यह है कि आप अभी भी पूर्णांकों और स्ट्रिंग्स उदाहरण के लिए साथ Comparables की एक सरणी पारित कर सकते हैं, जो एक RuntimeException का कारण होता है।

तो, आप एक समारोह है कि केवल एक सरणी जिसका तत्वों तुलनीय को लागू करने और सभी एक ही प्रकार (जैसे पूर्णांक, स्ट्रिंग, आदि?)

+0

हस्ताक्षर के साथ एक और समस्या यह है कि यह एक सामान्य बाध्य में कच्चे प्रकार का उपयोग कर रहा है। –

उत्तर

23

उपयोग

static <T extends Comparable<? super T>> sort(T[] array); 

है प्राप्त होगा बना सकते हैं जो कार्य को पूरा करने के लिए सबसे सामान्य विनिर्देश है। असल में, यह दावा करता है कि T एक प्रकार है जिसे तुलनात्मक रूप से तुलना की जा सकती है।

+0

आहा ... आखिरकार 'सुपर' का वैध उपयोग .. :) – falstro

+4

+1। यही वही हस्ताक्षर संग्रह है। रिसॉर्ट का उपयोग करता है। – Thilo

13

डिर्क का जवाब सबसे अच्छा आप प्राप्त कर सकते है, लेकिन गूगल संग्रह वास्तव में इस्तेमाल किया के रूप में आप javac में बग से बचने के लिए लिखा है:

आप विभिन्न APIs में प्रकार <E extends Comparable> का उपयोग क्यों करते हैं, जो "पूरी तरह से नहीं है generified "? यह <E extends Comparable<?>>, <E extends Comparable<E>> या <E extends Comparable<? super E>> नहीं होना चाहिए?

अंतिम सुझाव सही है, जैसा कि प्रभावी जावा में बताया गया है। हालांकि, हम <E extends Comparable<E>> पैरामीटर रहित विधियों का उपयोग एक भयानक जावैक बग के आसपास काम करने के लिए करेंगे। यह आपको समस्याएं पैदा करेगा जब आप java.sql.Timestamp जैसे एक बहुत ही असामान्य प्रकार का उपयोग करते हैं जो सुपरर्ट टाइप से तुलनीय है। (अधिक स्पष्टीकरण की जरूरत है।)

से: http://code.google.com/p/google-collections/wiki/Faq

अब यह आप पर निर्भर है ...

+1

विकी स्वरूपण ने आपके पॉइंट ब्रैकेट खाए ... – Thilo

+0

yuppy, अब मैं इसके लिए कोड का उपयोग करता हूं :( – nanda

2

बाद 1.5 जावा दुनिया में, संदर्भ सरणियों सिर्फ निम्न स्तर के कार्यान्वयन के विवरण हैं। पसंदीदा, संग्रह।

यदि आप संदर्भ अरणों में रुचि रखते हैं, तो कुछ असाधारण कारणों से, आपको पता होगा कि वे वास्तव में जेनेरिक के साथ नहीं चलते हैं। आप (उचित रूप से) एक सामान्य प्रकार की सरणी नहीं कर सकते हैं, जैसे कि Comparable<String>। इसका मतलब है कि Arrays.sort को Collections.sort के समान तरीके से जेनरेट किया गया था, तो यह अधिक बाधित होगा।

सरणी टाइपिंग की विशेष लक्षण की वजह से

, अगर आप ज्यादा विवश करने के लिए प्रकार चाहता था, मैंsort कुछ भी महत्वपूर्ण त्याग के बिना Collections.sort की तुलना में अधिक बस लिखा जा सकता है लगता है।

public static <T extends Comparable<T>> sort(T[] array) 

आप पूर्व जेनरिक के साथ दोहरी संगतता चाहते हैं, तो आप एक मामूली हैक की जरूरत Collections.min की पसंद करने के लिए वापस Object[] हस्ताक्षर करने के लिए, एक समान तरीके से होगा।

public static <T extends Object & Comparable<T>> sort(T[] array) 
संबंधित मुद्दे