2016-10-20 2 views
2

Я хотел бы использовать карту с различными списками в качестве значений:Почему это преобразование недействительно?

Map<String, List<Integer>> ml; 
Map<String, ?> ml2 = ml; // OK 
Map<String, List<?>> ml3 = ml; // Type mismatch 

Почему последняя строка не является действительным?

+0

«Карта >» - это карта, в которую вы можете поместить строку и список чего угодно. «Карта >» - это карта, в которую вы можете _only_ положить string и список целых чисел. – khelwood

ответ

7

Недействительно, так как если бы это было действительно, вы могли бы добавить нецелые списки в ml.

Пример (не действует):

Map<String, List<Integer>> ml; 
Map<String, List<?>> ml3 = ml; 

ml3.put("strings", Arrays.asList("evil","string")); 

List<Integer> l = ml.get("strings"); //see how this is going to fail? 

Почему Map<String, ?> ml2 = ml; действует? Это связано с тем, что использование подстановочного знака говорит компилятору не допускать добавления новых элементов, то есть ml2.put("strings", Arrays.asList("evil","string")); не будет разрешен (компилятор не выполняет проверку типа, он просто видит шаблон и знает, что вы не должны называть этот метод.

+0

Я думаю, было бы неплохо объяснить, почему преобразование в средней строке преуспевает в таком случае (и показывает, что вы не можете поместить что-либо в нее через эту ссылку, так что это безопасно). Плюс это ml3.put, но ml3.add;) –

+0

@ArturBiesiadowski да, исправлено опечатки и добавлено объяснение :) – Thomas

+0

Спасибо, я не видел проблему таким образом – jaudo

-1

Map<String, ?> возьмет карту строк для любого объекта, список целых может быть сопоставлен этим шаблоном. Однако List of Integer не соответствует List of? (List of any object), поскольку List of Integer может принимать только объекты Integer .

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