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

5

I have the following comparator class:

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()方法的未经检查的调用警告?


将比较器的定义更改为: ... implements Comparator<Tuple<? extends Comparable, ? extends Comparable>> 也没有帮助。 - Zoltan Magyar
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接