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

Zol*_*yar 5 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class Tuple<T1 extends Comparable, T2 extends Comparable>
{...}
Run Code Online (Sandbox Code Playgroud)

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

Roh*_*ain 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class Tuple<T1 extends Comparable<? super T1>, 
                   T2 extends Comparable<? super T2>> { }
Run Code Online (Sandbox Code Playgroud)

注意:我已经使用过Comparable<? super T1>而不是Comparable<T1>为了使它适用于超类型正在实现的子类型Comparable<SuperType>.

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