2015-04-13 46 views
1

關於分類泛型的堆棧溢出有很多問題;不過,我有興趣以最簡單的方式對泛型進行排序:沒有任何嵌套。下面的代碼是對一個通用集合或列表進行排序的嘗試。瞭解泛型分類的基礎知識

List<E> l = new LinkedList<>(arbSet); 
Collections.sort(l); 

arbSet只是一組元素:Set<E> arbSet

很明顯,這是有問題的 - 它不應該工作。爲了確保我知道這一點,Eclipse的讓我對我的嘗試調用下面.sort

約束不匹配:用的一般方法類型類別的排序(表< T>)不適用的參數(列表< E>)。推斷的類型E不是有界參數的有效替代品< T延伸可比較的<? super T >>

所以,我做了一下文檔諮詢,看看sortspecifications

其結果是,我試圖確保sort知道E延伸Comparable

第一行現在看起來像:

List<E extends Comparable<? super E>> l = new LinkedSet<>(arbSet); 

現在,Eclipse的規定:

語法錯誤在令牌「擴展」上,預計

我錯過了什麼?我覺得這是一個非常基本的例子,我只是缺少一些「手掌面對面」的東西。爲了進一步簡化它,所有的arbSet元素都是實現接口的元素。

+0

哪裏類型參數'E'聲明? – Radiodef

回答

2

只有當您提供自定義Comparator或者您嘗試分類的元素實現接口時,纔可以使用Collections.sort()。這取決於arbSet中存儲的元素。

例如,如果你想創建一個接受一組,並返回集合中元素的列表排序的方法,你會做這樣的事情:

static <E extends Comparable<E>> List<E> sortedListFrom(Set<E> set) { 
    List<E> l = new LinkedList<>(set); 
    Collections.sort(l); 
    return l; 
} 

編輯:

如果要做到這一點在構造函數中,你有兩個選擇:

  1. 就在構造函數之前聲明的類型E。當然,這不會有太大的作用,因爲list在構造函數完成後會丟失。

    class Test { 
        <E extends Comparable<E>> Test(Set<E> arbSet) { 
         List<E> list = new LinkedList<>(arbSet); 
         Collections.sort(list); 
         System.out.println(list); 
        } 
    } 
    
  2. 聲明類型E在類,這樣你就可以將結果保存在一個屬性。

    class Test<E extends Comparable<E>> { 
        List<E> list; 
    
        Test(Set<E> arbSet) { 
         this.list = new ArrayList<>(arbSet); 
         Collections.sort(this.list); 
         System.out.println(this.list); 
        } 
    }