2012-07-16 46 views
3

我必須編寫一個方法來排序整數和雙精度。Java - 使用Collections.sort排序()

public ArrayList<Number> sortDescending(ArrayList<Number> al){ 
    Comparator<Number> c=Collections.reverseOrder(); 
    Collections.sort(al,c); 
    return al; 
} 

public ArrayList<Number> sortAscending(ArrayList<Number> al){ 
    Collections.sort(al); 
    return al; 
} 

的問題是,在sortAscending,會出現以下錯誤:

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

回答

9

你需要使用一個通用的上限的NumberComparable<T>相交:

public <T extends Number & Comparable<T>> ArrayList<T> sortDescending(ArrayList<T> al){ 
    Comparator<T> c=Collections.reverseOrder(); 
    Collections.sort(al,c); 
    return al; 
} 

public <T extends Number & Comparable<T>> ArrayList<T> sortAscending(ArrayList<T> al){ 
    Collections.sort(al); 
    return al; 
} 

所有JDK Numbers(如FloatInteger等)符合此類型。

對於外行來說,語法<T extends A & B>是你必然要TAB的方式。

僅供參考,沒有「或」邏輯的語法(如果您仔細考慮,也不會有意義)

+0

謝謝。這解決了這個問題。案件結案。 – user1189571 2012-07-16 14:40:10

+2

僅供參考:沒有理由在您的任一方法上都有返回類型,因爲列表已排序。 – Matt 2012-07-16 15:47:36

+1

@Matt不是「沒有理由」,有幾個理由有返回類型:A)爲了說明鍵入方法的含義,B)OP就是這樣,C)從「非吸氣」方法返回對象是在實現[流利的API模式](http://en.wikipedia.org/wiki/Fluent_interface)時完成 – Bohemian 2012-07-17 01:01:42

4

由於編號沒有執行Comparable<Number>,您正在接收錯誤。您需要添加一個通用約束條件,以便它可以擴展數字和Comparable。在這種情況下:

public <T extends Number & Comparable<T>> ArrayList<T> sortAscending(ArrayList<T> al){ 
    Collections.sort(al); 
    return al; 
} 
相關問題