2010-07-24 9 views
10

मैंने जेनेरिक फ़ंक्शन लिखने की कोशिश की जो सरणी से डुप्लिकेट तत्वों को हटा देता है।सामान्य प्रकार पैरामीटर कैसे कहते हैं "विस्तार" तुलनात्मक नहीं "उपकरण"?

public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) { 
    //do quicksort 
    Arrays.sort(arr); 
    ArrayList<E> list = new ArrayList<E>(); 
    int i; 
    for(i=0; i<arr.length-1; i++) { 
     if(arr[i].compareTo(arr[i+1]) != 0) { //if not duplicate, add to the list 
      list.add(arr[i]); 
     } 
    } 
    list.add(arr[i]); //add last element 
    return list; 
} 

आप देख सकते हैं आप पूर्णांक [] सरणी की तरह आदिम प्रकार पारित नहीं हो सकता के बाद से मैं compareTo() विधि कि तुलनीय इंटरफ़ेस में निर्धारित द्वारा तत्वों की तुलना कर रहा हूँ।

public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) { 

कैसे आ यह कहते हैं, "तुलनीय फैली":

मैं पहली पंक्ति (विधि घोषणा) देखा?

तुलनात्मक एक इंटरफ़ेस है तो यह "तुलनात्मक लागू नहीं" क्यों है? यह पहली बार है जब मैंने जेनेरिक फ़ंक्शन लिखा था इसलिए मैं इस तरह के विवरण के बारे में उलझन में हूं। (कोई आश्चर्य मुझे समझने से रोक देगा ..)

संपादित करें: इस विषय से संबंधित इस आलेख को मिला।

http://www.tutorialspoint.com/java/java_generics.htm

+2

क्योंकि 'उपकरण विस्तारित करता है' –

+0

[जावा जेनेरिकों का संभावित डुप्लिकेट - क्यों "टी बढ़ाता है" लेकिन "टी लागू नहीं करता"? (Http://stackoverflow.com/questions/976441/java-generics- क्यों -इस-विस्तार-टी-अनुमत-लेकिन-नहीं-लागू-टी) – Lii

उत्तर

5

आप बात यह है कि आप को लागू करता है का उपयोग करना चाहते हैं, बस wirte के रूप में सामान्य पैरामीटर

class Bar extends Foo<String> { /* Code */} 
है

वाइल्डकार्ड कि आप के बारे में बात कर रहे हैं तीन

  1. रहे हैं "फैली टाइप करें?": टाइप प्रकार के उपप्रकारों के परिवार को दर्शाता है। यह सबसे अधिक उपयोगी वाइल्डकार्ड है
  2. "सुपर प्रकार?": इंगित करता है के प्रकार के प्रकार
  3. supertypes के एक परिवार "?": इंगित करता है सभी प्रकार के सेट या किसी

आप विधि चाहिए जैसे

public static <T extends Comparable<? super T>> Collection<T> sort(T[] list) { 

     Collection<T> list = new ArrayList<T>(); 

     //do quicksort 
     Arrays.sort(arr); 

     Collection<T> list = new ArrayList<T>(); 
     int i; 
     for(i=0; i<arr.length-1; i++) { 
      if(arr[i].compareTo(arr[i+1]) != 0) { //if not duplicate, add to the list 
       list.add(arr[i]); 
      } 
     } 
     list.add(arr[i]); //add last element 
//btw how do You know that last is not duplicate 
     return list; 

} 

देखने के लिए detali दलीलों पर जाएँ this page

+0

टिप के लिए धन्यवाद। अपने प्रश्न का उत्तर, "कैसे मैं पिछले नकल नहीं है पता है": क्रमबद्ध सरणी ए, बी, बी 1. मैं ArrayList के लिए एक डाल होते हैं। 2। इंडेक्स [1] और सूचकांक [1 + 1] के बाद से दूसरे बी को छोड़ दें। 3 लूप से बाहर निकलें। 4. अंतिम सूचकांक जोड़ें (जो अंतिम बी है) –

1

एक बात के लिए, E एक इंटरफेस हो सकता है।

+2

यह केवल एक वाक्य है। –

+5

बेशक यह एक वाक्य है। इसमें एक विषय, क्रिया, और वस्तु है। यह भी एक सही जवाब है। तुम्हारी समस्या क्या है? – EJP

10

यह वह जगह है सिर्फ जेनेरिक के लिए चुना गया सम्मेलन। बाध्य प्रकार पैरामीटर का उपयोग करते समय आप विस्तार करते हैं (भले ही इसका मतलब कुछ मामलों में लागू हो) या सुपर।

तुम भी परिभाषित करने के लिए कि उद्देश्य यह है कि प्रकार पैरामीटर की जगह लेंगे उन दोनों इंटरफेस को लागू करना चाहिए <E extends Comparable<E> & Cloneable> की तरह कुछ कर सकते हैं।

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