2010-07-24 74 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,在可比接口定義()方法比較元件不能傳遞原始類型如int []數組。

我注意到的第一行(方法聲明):

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

爲什麼它說: 「伸出可比」?

可比的接口,所以它爲什麼不是「落實可比」?這是我第一次編寫泛型函數,所以我對這樣的細節有點困惑。 (任何懷疑會阻止我的理解..)

編輯:發現這篇文章涉及到這個話題。

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

+2

因爲'implements extends extends' – 2010-07-24 20:39:33

+0

[Java泛型 - 爲什麼是「擴展T」而不是「實現T」?](http://stackoverflow.com/questions/976441/java-generics-why -is-延伸叔允許的但不-器具-T) – Lii 2016-01-22 09:07:44

回答

5

如果你想用它實現你的東西只是WIRTE是泛型參數

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

,你所談論的通配符有三個

  1. 「擴展類型?」:表示Type類型的子類型的家族。這 是最有用的通配符
  2. 「超級類型?」:表示類型類型
  3. 的超類型的家庭「?」:表示集合所有類型的或任何

你的方法應該看起來像

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

感謝您的提示。回答你的問題,「我怎麼知道最後是不是重複」: 如果有序陣列由A,B,B 1.我把A到ArrayList中。 2.自索引[1]和索引[1 + 1]相同,跳過第二個B。 3.取出循環。 4.添加最後一個索引(這是最後一個B) – 2010-07-24 20:49:20

1

一方面,E可能是一種接口。

+2

這是幾乎沒有一個句子。 – 2010-07-24 20:38:45

+5

當然這是一個句子。它有一個主語,動詞和賓語。這也是一個正確的答案。你怎麼了? – EJP 2010-07-25 01:11:49

10

這是隻是泛型選擇的慣例。當使用擴展類型參數(即使它可能意味着某些情況下的實現)或超級。

你甚至可以做這樣的事情<E extends Comparable<E> & Cloneable>定義,以取代類型參數的對象應該實現這兩個接口。