我用一个类型变量创建了一个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;
}
}
答案 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错误地通知你那个时间。接受答案是正确的,并且在我的答案中是合理的!!!