В настоящее время я работаю с Generics, и я не настолько опытен. Я получил эту проблему:Общий подстановочный вызов не будет компилироваться
Я сделал этот класс, чтобы сравнить 2 значения, реализующие Comparable
и сделать некоторые другие вещи, скажем приращение compareTo()
значения:
public final class Type<T extends Comparable<T>> {
public int compare(T val1, T val2) {
int compTemp = val1.compareTo(val2);
compTemp++;
// do stuff
return compTemp;
}
}
Теперь я создаю несколько экземпляров из Type
:
Type<Integer> t1 = new Type<Integer>();
Type<String> t2 = new Type<String>();
А теперь я хочу, чтобы поместить их в Map.
Как я не могу предсказать общий тип Type
я использую wilcard ?
:
Map<String, Type<?>> map = Maps.newHashMap();
map.put("t1", t1);
map.put("t2", t2);
Если я хочу, чтобы взывать Type.compare()
это работает t1
, но не для map.get(t1)
:
t1.compare(1,1); // compiles fine
map.get("t1").compare(1, 1); // does not compile
Последнее вызывает ошибку компиляции:
The method compare(capture#3-of ?, capture#3-of ?) in the type Type is not applicable for the arguments (int, int)
Я знаю, что это из-за моего wildcard, но я точно не знаю, почему и как это исправить. Единственное «исправление», которое я вижу, это использовать необработанные типы для Карты, однако это покажет несколько предупреждений. Я полагаю, что сейчас у меня есть огромное непонимание параметра wilcard.
Я ценю каждый ответ!
'.get (t1)'? Вашими ключами к карте являются 'String's; ваш 't1' не является строкой. – fge
typo, но не меняет факт, что он не работает – Don
Подстановочный знак означает, что вам не нужен фактический тип, который он представляет. Но ясно, что вам все равно, вот в чем проблема. Подумайте о том, что произойдет, если вы передадите мне эту карту, и я тайно сделал «map.put» («t1», новый тип()); '? Как мог компилятор обнаружить это? –
biziclop