2010-07-02 83 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()