Java泛型Comparable |实现compareTo

Java泛型Comparable |实现compareTo,java,generics,binary-search-tree,comparable,compareto,Java,Generics,Binary Search Tree,Comparable,Compareto,我面临java泛型的问题。我的计划是实现一个二叉搜索树(key和value),其中包含具有总排序的泛型。我从创建这个KeyValPair开始,面临着获得正确的compareTo方法的问题 public class KeyValPair <V extends Comparable<V>> implements Comparable<KeyValPair<V>>{ private int key; private V

我面临java泛型的问题。我的计划是实现一个二叉搜索树(key和value),其中包含具有总排序的泛型。我从创建这个
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;
        }
    }

}
现在我更新了KEYVALPAIR的代码,但是如果我用我的BST类和方法加法器测试它,例如:

private void adder(KeyValPair current,KeyValPair toInsert) {
    if(toInsert.getValue().compareTo(current.getValue())>0){
        //dosomething
    }
}
它抛出: 可比类型中的方法compareTo(捕获#2-of?)不适用于 论据(可比)

解决方案:

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

你这里的问题是你需要将
V
与另一个
V
进行比较,而你对它的运行时类型一无所知

它可以是一个
字符串
整数
,您显然不会以相同的方式对它们进行比较

因此我认为您的
KeyValPair
不应该实现
Comparable
,因为它的成员(
V
实例)已经在这样做了:

如果您想进行一些比较,您可以简单地执行以下操作:

leftChild.getValue().compareTo(rightChild.getValue());

getValue()
还应返回
compariable
,不需要使用通配符。

您不需要将键或值强制转换为compariable,因为
V
已经要求具有可比性。这样做只会增加使用类的难度,因为现在您只有一个可比较的
而不是可用的值或键

public int getKey() {
    return key;
}

public V getValue() {
    return value;
}

@Override
public int compareTo(KeyValPair<V> toComp) {
    return -this.getValue().compareTo(toComp.getValue());
}

例如,允许类
Apple extends Fruit implements Compariable
-如果这些类与超级类型相似,则仍然可以对它们进行排序。

你说的“不被接受”是什么意思?编译器确切地告诉你什么?Comparieto中的if语句不被接受”是什么意思?我怀疑getValue应该返回类型V btw。此行有多个标记-Comparable类型中的方法compareTo(capture#1-of?)不适用于参数(Comparable)-行断点:KeyValPair[行:39]-compareTo(KeyValPair)好的,我删除了工具和@Override,但是我如何才能与方法进行工作比较呢?如果我从不打字,我永远不知道如何比较,但泛型的意思是它们不必打字?我应该为每种类型实现比较方法吗?或者你有什么建议?thx BTW关键是您不必知道如何进行比较,因为
V
实例将知道您只需调用
compareTo
。它们已经是可比的了。好吧,我想我明白了,我更新了代码(见问题),但是现在我面临着另一个类BST的新问题
public int getKey() {
    return key;
}

public V getValue() {
    return value;
}

@Override
public int compareTo(KeyValPair<V> toComp) {
    return -this.getValue().compareTo(toComp.getValue());
}
class KeyValPair<V extends Comparable<? super V>>