繁体   English   中英

Java Generics Comparable | 实现compareTo

[英]Java Generics Comparable | implement compareTo

我正面临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?)方法不适用于参数(Comparable)

解:

我通过将KEYVALPAIR作为内部类添加到BST并使用V extends 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>这样的类Apple extends Fruit implements Comparable<Fruit> - 如果它们可以与超类型相媲美,那么仍然可以订购。

您的问题是,您需要将V与其他V进行比较,并且您对其运行时类型没有任何想法。

它可以是StringInteger ,你显然不会以同样的方式比较它们。

所以我认为你的KeyValPair不应该实现Comparable因为它的成员( V实例)已经这样做了: <V extends Comparable<V>>

如果你想进行一些比较,你可以简单地做一些事情:

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

getValue()也应该返回Comparable<V> ,不需要通配符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM