Почему это преобразование недействительно? [Дубликат]

2

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

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

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

  • 0
    Map<String, List<?>> - это карта, в которую можно поместить строку и список чего угодно. Map<String, List<Integer>> - это карта, в которую можно поместить только строку и список целых чисел.
Теги:

2 ответа

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 да, исправил опечатки и добавил объяснение :)
Показать ещё 2 комментария
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню