比较通用T对象

时间:2014-03-05 01:23:15

标签: java generics

我正在制作一个使用T作为主要参数的泛型类。我需要对一些Ts进行排序,但要做到这一点,我需要实现一个通用的compareTo。我一直在寻找如何做到这一点。我知道如何实现像

这样的东西
  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是Integer,它会比较整数,如果T是String,它会比较String)。基本上,这个:

  T.compareTo(T) 

我知道这可能是一个我忽略的简单解决方案,但我不明白,因为没有我可以比较的变量。

2 个答案:

答案 0 :(得分:1)

Comparable的通用形式与泛型类型参数一起使用,而不是没有Comparable的原始形式。将Foo个对象与其他Foo个对象进行比较是有意义的。我不会使用泛型类型参数;我只会在Foo上提供Comparable作为类型参数。

尝试

public class Foo implements Comparable<Foo> {

然后您的compareTo方法应该有效。

答案 1 :(得分: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设置专用的Sorter实例,则可以将type参数设置为类级别泛型参数,而不是使用静态方法。