【问题标题】:Explaination on CompareTo method for generics泛型的 CompareTo 方法说明
【发布时间】:2014-07-26 22:10:35
【问题描述】:

我创建了一个具有一个类型变量的通用类,它实现了 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;
    }
}

【问题讨论】:

  • 请贴一些代码。
  • 看不懂的具体问一下! @sky3287944!
  • @shekharsuman 在接受的答案中我无法理解以下内容: Comparable 是一个接口,那么这两种泛型类型如何扩展它......也在 compareTo() 方法的实现中为什么是它在自身上递归......

标签: java generics


【解决方案1】:

你提到的答案码是正确的!

让我详细解释一下代码。首先,让我们检查一下定义。

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

这是正确的,因为 Comparable 本身是一个泛型接口,Comparable 是由DoubleKey Class 实现的。特别注意类型参数 K 和 J 被 DoubleKey 类贴花然后传递给的方式可比接口,这样声明就可以了!我希望它能消除你的第一个疑问!

接下来,您的第二个疑问是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() 类型。它与外部compareTo() 方法类型的参数不匹配作为外部compareTo() 方法具有 DoubleKey 类型的参数,而内部 compareTo() 方法具有 that.getSecondaryKey()---referentially J 类型的参数。

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

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

Outer compareTo()(DoubleKey<K,J> that)  //parameter is of type DoubleKey<K,J>
Inner first compareTo()(K key1)               //parameter of type K for first Inner method
Innner second compareTo()(J key2)             //parameter of type J for second Inner method

希望能解答大家的疑惑,不明白的请留言!另外,很抱歉那次错误通知您。接受的答案在我的回答中是非常正确和合理的!!!

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多