2012-05-06 16 views
6

मैंने साइट पर ऐसे उदाहरण देखे हैं जो जेनरिक्स से कई पैरामीटर के साथ सौदा करते हैं लेकिन कोई भी मेरी स्थिति के लिए काम नहीं करता है।एकाधिक पैरामीटर के साथ जावा जेनरिक

तो यहां सौदा है: मैं जावा जेनरिक सीखने की कोशिश कर रहा हूं और एक साधारण बाइनरी सरणी खोज उपयोगिता फ़ंक्शन बनाने का निर्णय लिया है। मैं कस्टम ऑब्जेक्ट्स और पूर्णांक का उपयोग कर इसका परीक्षण कर रहा हूं। त्रुटियों और चेतावनी पर प्रतिक्रिया प्राप्त करने के लिए मैं ग्रहण का उपयोग कर रहा हूं।

public static int binarySearch(Comparable[] array, Comparable item, int start, int end) { 
    if(end < start) { 
     return -1; 
    } 
    int mid = (start + end)/2; 
    if(item.compareTo(array[mid]) > 0) { 
     return binarySearch(array, item, mid + 1, end); 
    } else if(item.compareTo(array[mid]) < 0) { 
     return binarySearch(array, item, start, mid - 1); 
    } else { 
     return mid; 
    } 
} 

तो जाहिर है मैं कह रहा जेनरिक parameterized किया जाना चाहिए कच्चे प्रकार के लिए चेतावनी मिलती है: यहाँ मैं क्या है। मैं यह सही तरीके से कैसे कर सकता हूं कि मेरे पास एकाधिक पैरामीटर हैं जो दोनों को एक ही प्रकार की आवश्यकता है?

public static <T extends Comparable<? super T>> int binarySearch(T[] array, T item, int start, int end) { ... } 

अतिरिक्त के लिए:

public static <T extends Comparable<? super T>> int binarySearch(T[] array, T item, int start, int end) { 
    if(array.length == 0) { 
     return -1; 
    } 
    if(item == null) { 
     return -1; 
    } 
    if(start < 0) { 
     return -1; 
    } 
    if(end < start) { 
     return -1; 
    } 
    int mid = (start + end)/2; 
    if(item.compareTo(array[mid]) > 0) { 
     return binarySearch(array, item, mid + 1, end); 
    } else if(item.compareTo(array[mid]) < 0) { 
     return binarySearch(array, item, start, mid - 1); 
    } else { 
     return mid; 
    } 
} 
+0

बस सूचना देने के लिए की तरह समारोह विशिष्ट सामान्य पैरामीटर निर्दिष्ट कर सकते हैं, इस अगर आप एक शून्य लंबाई या नल सरणी में पारित नहीं हो पाएगा। –

+0

हाँ, यह एक मामूली उदाहरण है - मुझे बाइनरी खोज नहीं, कई जेनरिकों की अवधारणा में रूचि है। हालांकि धन्यवाद। – jjNford

उत्तर

9

तुम इतनी

public static <T extends Comparable<? super T>> int binarySearch(T[] arr,T elem,int start,int end){ 
    //... 
} 
+0

इसके लिए क्या करता है? बस उत्सुक है - मैं इसे अक्सर देखता हूं लेकिन कभी स्पष्टीकरण के साथ नहीं। – jjNford

+1

यह कुछ अतिरिक्त प्रकार की सुरक्षा है और अधिक लचीलापन की अनुमति देता है ताकि आप किसी ऐसे सरणी को पास कर सकें जिसका सुपरक्लास लागू करता है तुलनात्मक –

+4

@ratchetfreak बिल्कुल नहीं ... यह कह रहा है कि 'टी' एक प्रकार की चीजें हो सकती है जो कुछ सुपरक्लास के तुलनीय हैं 'टी', जबकि 'arr' और' elm' को अभी भी एक सरणी और उसी प्रकार का तत्व होने के लिए मजबूर किया जाता है। – trutheality

5

यह सामान्य कार्यों बनाने के लिए विशिष्ट तरीका है:

समाधान

यहाँ काम कर समाधान सही पैरामीटर के चेक के साथ जेनरिक उपयोग कर रहा है सामान्यता, item है एक ही प्रकार के सरणी में बातें कर रहे हैं हो सकता है, और सरणी में बातें नहीं कर जब से तुम उन्हें कुछ भी करने के लिए की तुलना नहीं कर रहे हैं Comparable होने की है, तो

public static <T> int binarySearch(T[] array, Comparable<T> item, int start, int end) { ... } 

कुछ अतिरिक्त लचीलापन प्रदान करता है।

+0

अच्छा! मुझे इस पर भी आश्चर्य हो रहा था। संदर्भ के लिए मुझे लगता है कि एक कठोर दृष्टिकोण बेहतर होगा, लेकिन यह जानना बहुत अच्छा है। धन्यवाद। – jjNford

+0

महान उत्तर लेकिन बस पंच को हराया, मैं आपके जवाब को 1 डीफ़ कर दूंगा, हालांकि एक टन धन्यवाद। – jjNford

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