У меня есть следующее объявление класса: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
s и является общим и принимает тип T
, который можно сравнить с другим T
s.
У меня возникли проблемы вызывающую setValue()
и передавая ей Integer:
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' implments' Comparable ', а не' Comparable 'это вряд ли является источником вашей проблемы. –
kajacx
'public setValue' должен быть' public void setValue'. в противном случае, после реализации compareTo, я могу вызвать 'setValue (новый Integer (20))' без ошибки –
возможных дубликатов: http://stackoverflow.com/questions/5013947/create-a-compareto-to-a-generic- class-that-implementables-compar, http://stackoverflow.com/questions/21544716/implementing-comparable-with-a-generic-class – cuddlecheek