![](/img/trans.png)
[英]Java Generics :The method compareTo(capture#2-of ? extends E) in the type Comparable is not applicable for the arguments (Comparable)
[英]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
進行比較,並且您對其運行時類型沒有任何想法。
它可以是String
或Integer
,你顯然不會以同樣的方式比較它們。
所以我認為你的KeyValPair
不應該實現Comparable
因為它的成員( V
實例)已經這樣做了: <V extends Comparable<V>>
。
如果你想進行一些比較,你可以簡單地做一些事情:
leftChild.getValue().compareTo(rightChild.getValue());
getValue()
也應該返回Comparable<V>
,不需要通配符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.