Java错误将参数传递给一个方法,该方法采用T,其中T扩展了Comparable <t>

时间:2017-02-03 20:56:14

标签: java generics

我有以下类声明:

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>

1 个答案:

答案 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));
    }
}