Ошибка при добавлении записи в список карт - PullRequest
1 голос
/ 15 февраля 2012

Я немного новичок в дженериках в 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>)

Ответы [ 4 ]

2 голосов
/ 15 февраля 2012

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

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);
2 голосов
/ 15 февраля 2012

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

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>>();

Обновление: чтобы сделать это более явным, изображение принимает ссылку на 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 голосов
/ 15 февраля 2012

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

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

0 голосов
/ 15 февраля 2012
List<? extends Map<String, String>> listEntries = new ArrayList<HashMap<String,String>>();

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

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);
listEntries.add(new LinkedHashMap<String, String>()); // if you want you can use different implementations of Map
...