用于比较泛型类实例的Java Comparator

时间:2013-11-22 13:48:41

标签: java generics

我有以下比较器类:

public class CustomTupleComparator implements Comparator<Tuple>
{
    public int compare(Tuple o1, Tuple o2)
    {
        int result = o1.getSecond().compareTo(o2.getSecond());

        return result != 0
               ? result
               : - o1.getFirst().compareTo(o2.getFirst());
    }
}

Tuple类本身是通用的,有两个类型参数:

public class Tuple<T1 extends Comparable, T2 extends Comparable>
{...}

为什么我会取消选中有关compareTo()方法的警告?

1 个答案:

答案 0 :(得分:7)

  

为什么我会取消选中有关compareTo()方法的警告?

因为您使用的是原始类型Tuple,而不是参数化类型。但是,要使用参数化类型Tuple,您需要使CustomTupleComparator类本身通用:

public class CustomTupleComparator<T1 extends Comparable<? super T1>, 
                                   T2 extends Comparable<? super T2>> 
             implements Comparator<Tuple<T1, T2>>
{
    @Override
    public int compare(Tuple<T1, T2> o1, Tuple<T1, T2> o2)
    {
        int result = o1.getSecond().compareTo(o2.getSecond());

        return result != 0 ? result
                           : -o1.getFirst().compareTo(o2.getFirst());
    }
}

此外,您应该更改Tuple类,以使类型参数使用通用Comparable,而不是原始类型:

public class Tuple<T1 extends Comparable<? super T1>, 
                   T2 extends Comparable<? super T2>> { }

注意:我使用了Comparable<? super T1>而不是Comparable<T1>,以使其适用于超类型,其中超类型正在实现Comparable<SuperType>

此外,由于Comparable是消费者,因为他们消费他们正在比较的类型,我们使用? super T1