我面临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(capture#1-of?)方法不适用于自变量(Comparable)-行断点:KeyValPair [line:39]-compareTo(KeyValPair )

编辑2:

更新的代码:

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的代码,但是如果我使用带有方法adder的BST类对其进行测试,例如:

private void adder(KeyValPair current,KeyValPair toInsert) {
    if(toInsert.getValue().compareTo(current.getValue())>0){
        //dosomething
    }
}


它抛出:
Comparable类型的compareComp(capture#2-of?)方法不适用于
 参数(可比)

解:

我通过将KEYVALPAIR作为BST的内部类并使用V扩展Comparable解决了这一问题。
现在可以使用,谢谢您的帮助。

最佳答案

您不需要将键或值转换为可比值,因为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>这样的类-如果它们与超类型相当,则仍可以排序。

关于java - Java泛型可比实现compareTo,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20372957/

10-12 06:27