我遇到了 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 [行:39] -比较(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 的代码,但是如果我使用带有方法加法器的 BST 类对其进行测试:
private void adder(KeyValPair current,KeyValPair toInsert) {
if(toInsert.getValue().compareTo(current.getValue())>0){
//dosomething
}
}
它抛出: Comparable 类型中的方法compareTo(capture#2-of ?) 不适用于 参数(可比较)
解决方案:
我通过将 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>
这样的类(class)- 如果它们与 super 类型相当,仍然可以订购。
关于Java 泛型比较 |实现比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20372957/