2014-10-24 3 views
0

Метод:Метод вызова не соответствует сигнатуру метода, даже если метод использует более общие типы

public static void incrementMapCounter(Map<Object,Number> tabulationMap, Object key) { 
    Number value = 0; 
    if (tabulationMap.containsKey(key)) { 
    value = tabulationMap.get(key); 
    } 
    value = value.doubleValue() + new Double(1); 
    tabulationMap.put(key, value); 
} 

вызов метода:

Map<String,Long> counts = new HashMap<>(); 
String key = "foo-bar"; 
incrementMapCounter(counts, key); 

Ошибка (переформатировать):

The method 
    incrementMapCounter(Map<Object,Number>, Object) 
in ... is not applicable 
    for the arguments (Map<String,Long>, String) 

Подпись метода является либо совпадающим, либо более общим:

  • Карта является Карта
  • Строка является объектом (x2)
  • Long является номер

Я немного запутался на этом.

ответ

1

Это последние два. Строка и объект не совпадают. Дженерики не ковариантны, они инвариантны. Типы должны точно соответствовать. То же самое с длинным и числом.

Для вашего метода подписи вы можете попробовать:

public static <T> void incrementMapCounter(Map<? extends T, ? extends Number> map, T key) 
{ ... 

который может быть вызван:

HashMap<String, Integer> myMap = new HashMap<>(); 
incrementMapCounter(myMap, "warble"); 
+0

Как бы вы заявили об этом, если используете bo й аргумент, карту и ключ? Я пробовал пару способов, void incrementMapCounter (Карта map, Object key) // void incrementMapCounter (Карта map, )) // void incrementMapCounter (Карта карта, клавиша K). В помеченном «дубликате» вопросе, в последнем абзаце ответа @ Yishai http://stackoverflow.com/a/2745357/295802, похоже, это невозможно: «единственный способ сделать то же самое время должно иметь определенный тип " –

+0

Hah! Извините, пропустил второй аргумент. Используйте общий метод для этого. Я уточню свой ответ. – markspace

0

Дженерики invariant, так что аргументы должны соответствовать аргументы, передаваемые в так что значения могут быть добавлен в Collection

public static void incrementMapCounter(Map<String, Long> map, Object key) {