我遇到了java泛型的问题。我的计划是使用具有总排序的泛型实现二叉搜索树(键和值)。我首先创建了这个KeyValPair
并遇到了获得正确的compareTo方法的问题。
public class KeyValPair <V extends Comparable<V>>
implements Comparable<KeyValPair<V>>{
private int key;
private V value;
private KeyValPair<V> leftchild;
private KeyValPair<V> rightchild;
public KeyValPair(int k,V v){
key=k;
value=v;
}
public Comparable<?> getKey(){
return key;
}
public Comparable<?> getValue(){
return value;
}
public void setRightChild(KeyValPair<V> r){
rightchild=r;
}
public KeyValPair<V> getRightChild(KeyValPair<V> r){
return rightchild;
}
public void setLeftChild(KeyValPair<V> l){
leftchild=l;
}
public KeyValPair<V> getLeftChild(KeyValPair<V> l){
return leftchild;
}
@Override
public int compareTo(KeyValPair<V> toComp) {
if(this.getValue().compareTo(toComp.getValue())>0){
return -1;
}else if(this.getValue().compareTo(toComp.getValue())==0){
return 0;
}else{
return 1;
}
}
}
compareTo
中的if句子没有被加入,我认为这是因为我覆盖了compareTo
,但我应该如何比较泛型?
还尝试了Comparable
而不是K
,结果相同。
最好的问候
编辑:编译器说的是:此行的多个标记 - Comparable类型中的compareTo(捕获#1-of?)方法不适用于参数(可比较) - 行断点:KeyValPair [line:39] - 的compareTo(KeyValPair)
EDIT2:
更新代码:
public class KeyValPair{
private int key;
private Comparable<?> value;
private KeyValPair leftchild;
private KeyValPair rightchild;
public KeyValPair(int k,Comparable<?> v){
key=k;
value=v;
}
public Comparable<?> getKey(){
return key;
}
public Comparable<?> getValue(){
return value;
}
public void setRightChild(KeyValPair r){
rightchild=r;
}
public KeyValPair getRightChild(KeyValPair r){
return rightchild;
}
public void setLeftChild(KeyValPair l){
leftchild=l;
}
public KeyValPair getLeftChild(KeyValPair l){
return leftchild;
}
}
现在我更新了KEYVALPAIR的代码,但是如果我用我的BST类和方法加法器测试它作为例子:
private void adder(KeyValPair current,KeyValPair toInsert) {
if(toInsert.getValue().compareTo(current.getValue())>0){
//dosomething
}
}
它抛出: Comparable类型中的compareTo(捕获#2-of?)方法不适用于 参数(可比较)
解决方案:
我通过将KEYVALPAIR作为内部类添加到BST并使用V extends Comparable来解决它。 立即行动,感谢您的帮助。
答案 0 :(得分:2)
您不需要将键或值转换为可比较的,因为V
已经需要具有可比性。这样做会让您更难使用您的课程,因为现在您只有一个Comparable
而不是可用的值或键。
public int getKey() {
return key;
}
public V getValue() {
return value;
}
@Override
public int compareTo(KeyValPair<V> toComp) {
return -this.getValue().compareTo(toComp.getValue());
}
您还应考虑放宽V
必须实施Comparable<V>
class KeyValPair<V extends Comparable<? super V>>
允许例如像Apple extends Fruit implements Comparable<Fruit>
这样的类 - 如果它们与超类型相当,那么它们仍然可以被订购。
答案 1 :(得分:0)
您的问题是,您需要将V
与其他V
进行比较,而您对其运行时类型一无所知。
它可以是String
或Integer
,但您显然不会以相同的方式对它们进行比较。
所以我认为您的KeyValPair
不应该实现Comparable
,因为其成员(V
个实例)已经这样做了:<V extends Comparable<V>>
。
如果你想进行一些比较,你可以简单地做一些事情:
leftChild.getValue().compareTo(rightChild.getValue());
getValue()
也应返回Comparable<V>
,不需要通配符。