2012-02-15 3 views
1

Я немного новичок в дженериках Java. Я столкнулся со следующей ситуацией, и я не понимаю, почему код не работает.Ошибка при добавлении записи в список карт

List<? extends Map<String, String>> listEntries = new ArrayList<HashMap<String,String>>(); 
Map<String,String> entry = new HashMap<String,String>(); 
smsListEntry.put("1", "abc"); 
smsListEntry.put("2", "xyz"); 
listEntries.add(entry); 

Это дает мне ошибку времени компиляции, который говорит что-то вроде:

Метод add(capture#1-of ? extends Map<String,String>) в типе List<capture#1-of ? extends Map<String,String>> не применяется для аргументов (Map<String,String>)

+0

Я отформатировал фрагменты кода в указанном сообщении об ошибке. '<' and '>' интерпретируются как разметка по умолчанию, если вы не отформатируете их как код (путем помещения их между обратными окнами (') или отступом текста на 4 пробела). –

+0

@ PéterTörök - Я этого не знал. Благодарю. –

ответ

-1
List<? extends Map<String, String>> listEntries = new ArrayList<HashMap<String,String>>(); 

Вы должны написать это как

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>(); 

Вы должны определить тип списка, используя записи Interface.

И затем использовать его как:

Map<String,String> entry = new HashMap<String,String>(); 
entry.put("1", "abc"); 
entry.put("2", "xyz"); 
listEntries.add(entry); 
listEntries.add(new LinkedHashMap<String, String>()); // if you want you can use different implementations of Map 
+0

Я попробовал это первым. Это снова приводит к ошибке компиляции: «несоответствие кода: невозможно преобразовать из ArrayList > в список >' –

+0

Это не скомпилируется, потому что 'List > 'is ** not ** a' List > '. –

+0

Удалить «Хеш». –

2

Попробуйте это.

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>(); 
      Map<String,String> entry = new HashMap<String,String>(); 
      entry.put("1", "abc"); 
      entry.put("2", "xyz"); 
      listEntries.add(entry); 
      System.out.println(listEntries); 
+0

Это работает, спасибо! –

3

Представьте себе, если вы изменили

Map<String,String> entry = new HashMap<String,String>(); 

в

Map<String,String> entry = new TreeMap<String,String>(); 

Теперь вы добавили TreeMap ваши ArrayList из HashMap.

Проведите подстановочные знаки и используйте общий аргумент, который вы действительно хотите.

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>(); 

Update: Для того, чтобы сделать это более четко, изображение принимая ссылку на ArrayList с оригинальными дженериков.

List<HashMap<String,String>> orig = new ArrayList<HashMap<String,String>>(); 
List<? extends Map<String, String>> listEntries = orig; 
listEntries.add(new TreeMap<>()); // Shouldn't work! 
HashMap<String,String> treeMap = orig.get(0); // Oops! 
+0

Хорошо, извините, я немного смущен здесь. 'List > listEntries = new ArrayList >() '. Это утверждение означает, что я хочу список объектов, которые могут быть любыми, которые расширяют map.It может быть HashMap или TreeMap или просто Карта. Если это так, то строка - 'listEntries.add (запись); 'должен работать, потому что запись является Map (хотя реализована как HashMap). Не могли бы вы рассказать мне, где мое понимание перепутано? –

+0

@Poornima Prakash Что вы на самом деле создали, это 'ArrayList'' HashMap'. У вас может быть ссылка на этот объект. –

0

В принципе, List<? extends Map<...> означает «У меня есть список ограничен содержать некоторый тип, который проходит Map, но я не знаю точного типа». Теперь предположим, что точный тип на самом деле TreeMap: имеет смысл, что вы не можете поместить HashMap в этот список.

Вообще говоря, если у вас есть Type<E> и вы объявляете Type<? extends X> var, вы никогда не будет позволено вызывать любой метод на var, который принимает E в качестве параметра, поскольку компилятор не может определить, что ? позволяет (возможно X, но, может быть, только некоторые подтип X). Вот почему вы не можете позвонить add здесь.

Смежные вопросы