创建一个 compareTo 到实现可比较的泛型类

2022-09-02 10:13:01

我有一个具有两个类型变量的泛型类,它实现了java.lang.Comparable。

public class DoubleKey<K,J> implements Comparable<DoubleKey<K,J>>{

    private K key1;
    private J key2;

    public DoubleKey(K key1, J key2){
        this.key1 = key1;
        this.key2 = key2;
    } 

    public K getFirstKey(){
        return this.key1;
    }

    public J getSecondKey(){
        return this.key2;
    }

    // need for Comparable interface
    public int compareTo(DoubleKey<K,J> aThat){
        ...
    }

}

Becuase我用Compaable实现了它,我需要编写compareTo()方法。因为K,J可以是任何类型,所以我在如何完全比较它们方面遇到了问题。有没有办法能够在比较中捕获所有可能的类型(基元,包装器,对象)?感谢您的帮助!


答案 1

因此,总结上述内容并将其拼图成一个工作代码,这是:

    public class DoubleKey<K extends Comparable<K>, J extends Comparable<J>>
        implements Comparable<DoubleKey<K, J>> {

    private K key1;
    private J key2;

    public DoubleKey(K key1, J key2) {
        this.key1 = key1;
        this.key2 = key2;
    }

    public K getFirstKey() {
        return this.key1;
    }

    public J getSecondKey() {
        return this.key2;
    }

    public int compareTo(DoubleKey<K, J> that) {

        int cmp = this.getFirstKey().compareTo(that.getFirstKey());
        if (cmp == 0)
            cmp = this.getSecondKey().compareTo(that.getSecondKey());
        return cmp;
    }
}

答案 2

您是否想引入一个要求,并有一个可以使用的自然排序?在这种情况下,您可以像这样声明您的类:KJDoubleKey

class DoubleKey<K extends Comparable<K>, J extends Comparable<J>>

然后,您可以根据需要定义DoubleKey。您可以执行如下操作:compareTo

getFirstKey().compareTo(aThat.getFirstKey())

但是,您无法将 的任何实例与 的实例进行比较。没有对这些类型定义任何排序。KJ

如果这些类型不一定具有自然排序(许多类型没有),则可以将 and 作为构造函数的参数。Google Guava的优秀Maps类已经可以做到这一点,您可以将其用作示例(具体请参阅它们接受的类型的方法和边界)。Comparator<K>Comparator<J>DoubleKeynewTreeMap