2017-02-03 26 views
2

我有下面的類聲明中的方法:Java錯誤傳遞參數給接受其中T延伸可比<T>

public class UserVariable<T extends Comparable<T>> implements Comparable<UserVariable<T>> 
{ 
    private T myValue; 

    public void setValue(T value) 
    { 
     myValue = value; 
    } 

    public T getValue() 
    { 
     return myValue; 
    } 

    public int compareTo(UserVariable<T> rhs) 
    { 
     return getValue().compareTo(rhs.getValue()); 

    } 
} 

如果我做了正確的,我想要的東西是:UserVariable可以比其他UserVariable s並且它是通用的並且接受可以與其他T s進行比較的類型T

我有麻煩調用setValue(),並傳遞一個整數:

UserVariable<Integer> newVar = new UserVariable<Integer>(); 
newVar.setValue(new Integer(20)); 

給我的錯誤「的方法setValue(Comparable<Comparable<T>>)在類型UserVariable<Comparable<Comparable<T>>>不適用於參數(Integer)」。

我不明白爲什麼我得到這個錯誤。首先,Integer執行Comparable<Integer>。其次,爲什麼Comparable在錯誤消息中以嵌套的方式出現了兩次(Comparable<Comparable<T>>)?是的,UserVariable也實現了Comparable,但錯誤是指方法參數的類型,它的類型是T,它應該是T extends Comparable<T>,對吧?

UPDATE:

我已經意識到了問題的事實,我從一個通配符檢索集合對象連接:

Map<String, UserVariable<?>> myVars = new HashMap<>(); 

UserVariable<Double> v1 = new UserVariable<>(); 
v1.setValue(3.0); 

myVars.put("doubleVar", v1); 

myVars.get("doubleVar").setValue(new Double(30)); 

添加上面的代碼將重現的編譯錯誤最後一行。

我很抱歉,恐怕問題的範圍已經完全改變了最新的信息,因爲我正在從UserVariable<?>類型的地圖中拉出一個對象,並試圖對此致電setValue()

+3

您應該使用'>',但是看到那'Integer'暗示'Comparable '而不是'Comparable '這不太可能是你問題的根源。 – kajacx

+1

'public setValue'應該是'public void setValue'。否則,在實現compareTo之後,我可以調用'setValue(new Integer(20))'而不會出現錯誤 –

+0

可能的重複項:http://stackoverflow.com/questions/5013947/create-a-compareto-to-a-generic- class-that-implement-comparable,http://stackoverflow.com/questions/21544716/implementing-comparable-with-a-generic-class – cuddlecheek

回答

1

有需要改變兩件事情:

  • public class UserVariable<T extends Comparable<T>> implements Comparable<UserVariable<T>>

    在類的聲明,要實現Comparable<UserVariable<T>>其中UserVariable本身再次實現Comparable這就是爲什麼你在錯誤消息越來越Comparable<Comparable<T>>

  • public setValue(T value)

    不知道它是否是一個錯字,但該方法需要返回類型,你可以把它改成public void setValue(T value)

下面是這些更改後工作的例子:

public class UserVariable<T extends Comparable<T>> implements Comparable<T> { 

    @Override 
    public int compareTo(T o) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    private T myValue; 

    public void setValue(T value){ 
     myValue = value; 
    } 

    public static void main(String[] args) { 
     UserVariable<Integer> newVar = new UserVariable<Integer>(); 
     newVar.setValue(new Integer(20)); 
    } 
} 

更新

如果要比較兩個UserVariable對象,你只需要實現compareTo方法並添加return type到setter方法,下面應該工作:

public class UserVariable<T extends Comparable<T>> implements Comparable<UserVariable<T>> { 
    private T myValue; 

    public void setValue(T value) { 
     myValue = value; 
    } 

    public T getValue() { 
     return myValue; 
    } 

    public int compareTo(UserVariable<T> rhs) { 
     return getValue().compareTo(rhs.getValue()); 

    } 

    public static void main(String[] args) { 
     UserVariable<Integer> newVar = new UserVariable<Integer>(); 
     newVar.setValue(new Integer(20)); 
    } 
} 
+0

謝謝。但是,我希望能夠將'UserVariable '與另一個'UserVariable '進行比較,而不是將其與'T'比較。 – skrilmps

+0

@skrilmps我已更新我的答案併爲'UserVariable '添加了另一個示例。 –

相關問題