我有以下类声明:
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
进行比较,并且它是通用的,并接受可以与其他{T
进行比较的类型T
1}} S上。
我无法调用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>
,对吧?
更新:
我意识到这个问题与我从通配符集合中检索对象的事实有关:
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()
。 / p>
答案 0 :(得分: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));
}
}