2010-07-02 49 views
5

我有一個小問題,並想知道如何解決它。我有一個泛型類Tuple<A,B>,現在我想根據A和B.它應該是這樣的元組進行排序:確保物體實現可比較

未分類:

 
(1,5) 
(2,8) 
(6,8) 
(1,4) 
(2,4) 

排序:

 
(1,4) 
(1,5) 
(2,4) 
(2,8) 
(6,8) 

對於之所以我想在Tuple類中實現通用比較方法(public int compareTo(Tuple<A, B> other))。唯一的問題是你可以參數化類的所有對象(例如A = Integer,B = String)必須實現compareTo方法才能使整個事情發揮作用。

有沒有辦法確保Tuple的所有對象都可以實現Comparable接口?

或者還有其他建議如何解決這個問題?

謝謝

回答

5

你可以使用遞歸的類型限制(又見項目的Effective Java 27)指定的元組的部件延長可比,就像這樣:

public class Tuple<A extends Comparable<? super A>, B extends Comparable<? super A>> implements Comparable<Tuple<A, B>> { 
    A valueA; 
    B valueB; 

    @Override 
    public int compareTo(Tuple<A, B> tuple) { 
     // Implement comparison logic 
     return 0; 
    } 
} 

這使您可以爲組件指定不同類型的元組(Tuple < Integer,字符串>)。

+0

我更喜歡'A extends Comparable ',但是爲了在Tuple本身上實現Comparable,我需要+1。我應該記住這一點。 – 2010-07-02 15:15:40

+0

啊,謝謝。我已經編輯了我的答案,以免誤導,並提供了mmvyer的版本。 – Lyle 2010-07-02 15:35:35

1

這應該可以做到。您指定的任何類都必須擴展Comparable。

public class Tuple<? extends Comparable> { 
} 
+0

我意識到你沒有看到Tuple的原始通用聲明就寫了這個,所以我不能責怪你錯過了A和B參數。但即便如此,它還是會因爲您沒有參數化Comparable而導致警告。 – 2010-07-02 15:06:07

7

如果類聲明爲

public class Tuple<A extends Comparable<? super A>, 
        B extends Comparable<? super B>> { ... 

那麼確保A和B是自相媲美。然後,您可以在課程中的任何類型爲A或B的對象上撥打compareTo()