Java 将参数传递给采用 T 的方法时出错,其中 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进行比较,它是通用的,接受可以与其他T进行比较的类型T

我在调用setValue()并向其传递整数时遇到问题:

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

给了我错误"UserVariable<Comparable<Comparable<T>>>类型setValue(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()

有两件事需要改变:

  • 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));
}
}

相关内容

最新更新