我有下面的類聲明中的方法: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()
。
您應該使用'>',但是看到那'Integer'暗示'Comparable '而不是'Comparable '這不太可能是你問題的根源。 –
kajacx
'public setValue'應該是'public void setValue'。否則,在實現compareTo之後,我可以調用'setValue(new Integer(20))'而不會出現錯誤 –
可能的重複項: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