2014-03-05 137 views
0

我正在製作一個泛型類,它使用T作爲主要參數。我需要對一些Ts進行排序,但要做到這一點,我需要實現一個通用的compareTo。我一直在尋找如何做到這一點。我知道如何實現像比較泛型T對象

public class Foo implements Comparable { 
     private int age; 
     public Foo (int age) { 
      this.age = age; 
     } 
     public int compareTo(Foo a) { 
      if (age < a.age) { 
       return -1; 
      } 
      if (age == a.age) { 
       return 0; 
      } 
      if (age > a.age) { 
       return 1; 
      } else { 
       return 0; 
      } 
     } 
    } 

,但我失去的時候我試圖比較兩個通用的對象(例如,如果T是整數,它比較整數,如果T是字符串,它比較字符串) 。基本上,這個:

T.compareTo(T) 

我知道這可能是我俯瞰一個簡單的解決方案,但我不明白,因爲沒有可變我可以比較。

+1

請勿使用原始類型。 –

+0

看起來你正在尋找[有界通配符](http://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html)?但很難從你的問題或至少沒有你的通用實現的僞代碼中分辨出來。 – vanza

+1

你是說你有類似'公共類ThingWithComparable >實現Comparable >'和'T'裏面的字段,你想比較嗎? –

回答

1

使用帶有泛型類型參數的Comparable的通用形式,而不使用原始形式的Comparable。將Foo對象與其他Foo對象進行比較是有意義的。我不會使用泛型類型參數;我只需要提供Foo作爲Comparable上的類型參數。

嘗試

public class Foo implements Comparable<Foo> { 

然後你compareTo方法應該工作。

+0

雖然我仍然不明白我通常會如何比較插入的對象。 – Aire

+1

@aire'someFooReference.compareTo(someOtherFooReference)' –

+0

也許有些東西我還沒有到這裏...我不確定如何編寫泛型的compareTo方法 – Aire

1

如果你希望你的班級能夠排序一些任意類型的東西T,你有兩個選擇,如果你喜歡,你可以一次完成。

public class Sorter { 
    public static < T extends Comparable< ? super T > > 
    void sort(T[] atUnsorted) { 
     // here you know that the elements of atUnsorted 
     // can be compared with each other using their 
     // compareTo methods 
     ... 
    } 
    public static <T> void sort(
     T[] atUnsorted, Comparator< ? super T > cmpT 
    ) { 
     // here you can use cmpT.compare to compare 
     // any two elements in atUnsorted 
     ... 
    } 
} 

如果你喜歡有每種類型T可以使類型參數到類級通用參數,而不是使用靜態方法專用分揀機實例。