对泛型的CompareTo方法的解释

时间:2014-07-26 22:10:36

标签: java generics

我用一个类型变量创建了一个Generic Class,它实现了java.lang.Comparable。我在如何将compareTo()方法实现为<,>时遇到问题运算符无效用于泛型类型。我遇到了这个

Create a compareTo to a Generic Class that Implements Comparable

通过遵循接受的ans我能够实现compareTo方法,但我不明白它是如何工作的,请任何人都可以解释.... 我所指的答案是......

    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;
    }
}

1 个答案:

答案 0 :(得分:1)

您提到的答案代码是正确的!

让我以详细的方式向您解释代码。首先,让我们检查定义。

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

这是正确的,因为Comparable本身就是一个通用接口,而Comparable正由DoubleKey Class实现。要特别注意DoubleKey类对类型参数K和J进行十分方式的方式然后传递给Comparable Interface,可以用这种方式声明!我希望它能清除你的第一个怀疑!

接下来,你的第二个疑问是recursive call in compareTO() method!虽然看起来很乍一看,但事实并非如此。仔细判断后你会发现它不会进行递归,因为缺少Object就不会调用代码。

澄清更多,

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;
}

首先调用this(the current calling object),然后在其上调用getFirstKey(),然后调用标准Comparable接口的compareTo()方法。接下来,传递给外部compareTo()方法的内部定义中的compareTo()方法的参数是that.getgetSecondarykey()类型。它与外部{{1}的类型参数不匹配方法作为外部compareTo()方法具有类型为DoubleKey的参数,而内部compareTo()方法具有类型compareTo()的参数---引用J。

所以,现在,显然,传递给外部和内部that.getSecondaryKey()方法的参数不同.Inner compareTo()是Comparable Interface中定义的标准compareTo(),这就是作者实现Comparable Interface的原因!

为了更清楚,我正在简化两种方法的参数: -

compareTo()

我希望它能回答你所有的疑惑。如果你不明白,请发表评论!另外,SORRY错误地通知你那个时间。接受答案是正确的,并且在我的答案中是合理的!!!