java - Java 中的 Comparable 和 Comparator 接口(interface)

标签 java generics comparator comparable

我想写一个通用的 Pair 类,它有两个成员:key 和 value。这个类唯一的要求是键和值都应该实现 Comparable 接口(interface),否则 Pair 类将不会接受它们作为类型参数。
首先,我这样编码:

public class Pair<T1 extends Comparable, T2 extends Comparable>

但是 JDK 1.6 编译器会生成警告:

Comparable is a raw type. References to generic type Comparable<T> should be parameterized

然后我尝试添加类型参数,代码现在看起来像这样:

public class Pair<T1 extends Comparable<? extends Object>,
                  T2 extends Comparable<? extends Object>>

现在一切顺利,直到我尝试为 Pair 生成比较器。(以下代码在 Pair 类中)

public final Comparator<Pair<T1, T2>> KEY_COMPARATOR = new Comparator<Pair<T1, T2>>() {
        public int compare(Pair<T1, T2> first, Pair<T1, T2> second) {
            *first.getKey().compareTo(second.getKey());*
            return 0;
        }
    };

代码 first.getKey().compareTo(second.getKey()); 会产生一个错误:

The method compareTo(capture#1-of ? extends Object) in the type Comparable<capture#1-of ? extends Object> is not applicable for the  arguments (T1)

谁知道这条错误信息是什么意思?
欢迎提供有关此主题的任何提示。

更新:
完整代码如下:

public class Pair<T1 extends Comparable<? extends Object>, T2 extends Comparable<? extends Object>> {
    private T1 key;
    private T2 value;

    public static int ascending = 1;
    public final Comparator<Pair<T1, T2>> KEY_COMPARATOR = new Comparator<Pair<T1, T2>>() {
        public int compare(Pair<T1, T2> first, Pair<T1, T2> second) {
            int cmp = first.getKey().compareTo((T1)(second.getKey()));
            if (cmp > 0)  return ascending;
            return -ascending;
        }
    };
}

@MarvinLabs 你能解释一下为什么编译器不能确保将对象与其他相同类型的对象进行比较。上述代码中,second.getKey()返回的是T1类型,与first.getKey()

是同一类型

最佳答案

我会这样声明我的类(class):

public class Pair<T1 extends Comparable<T1>, T2 extends Comparable<T2>> 

意思是对象可以与相同类型的对象进行比较(你的错误意味着编译器无法确保对象与其他相同类型的对象进行比较)。


经过我的编辑,您的代码可以正确编译:

public class Pair<T1 extends Comparable<T1>, T2 extends Comparable<T2>> {
    private T1 key;
    private T2 value;

    public T1 getKey() {
        return key;
    }

    public T2 getValue() {
        return value;
    }

    public final Comparator<Pair<T1, T2>> KEY_COMPARATOR = new Comparator<Pair<T1, T2>>() {
        public int compare(Pair<T1, T2> first, Pair<T1, T2> second) {
            return first.getKey().compareTo(second.getKey());
        }
    };

    public static void test() {
        Pair<String, Integer> p1 = new Pair<String, Integer>();
        Pair<String, Integer> p2 = new Pair<String, Integer>();

        p1.KEY_COMPARATOR.compare(p1, p2);
    }
}

然而,您应该为比较器创建一个单独的类(或静态最终类),以便使用起来更直观并且不会增加每个 Pair 实例的权重。

关于java - Java 中的 Comparable 和 Comparator 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13026189/

相关文章:

java - SQL/HQL查询: find object that has a list of objects that matchs some parameters

java - IdentityManager接缝问题

java - 在java中将两个图像平铺在一起而没有空格

java - 为什么不能在 Java 中将 Collection<SomeType> 转换为 Collection<OtherType> ?

c# - 是否可以从委托(delegate)中别名/引用委托(delegate)?

java - 为什么锁定被捕获到局部变量

c# - 取决于类型 T 的枚举

java - 比较器比较内部列表字段

java - 按排名和字母顺序对 IRC 用户进行排序 - Java Comparator

java - 最少的代码,缩短表达