В книге «Дженерики Java» и сборники Мориса Нафталина, Филиппа Вадлера, я шел через ограничения Generics и сомневался. Может быть, это ответ в книге, но я думаю, что я запутался в ловушке.
В следующем коде:
Тип Предупреждение о безопасности
List<List<?>> lists = new ArrayList<List<?>>();
lists.add(Arrays.asList(1,2,3));
lists.add(Arrays.asList("four","five"));
assert lists.toString().equals("[[1, 2, 3], [four, five]]");
Как сказано в книге, что вложенные шаблоны конкретизация не имеет никаких проблем, потому что в первый список, он знает, что он будет содержать объекты типов списков.
Но я попытался изменить приведенный выше код и придумал одно предупреждение и одну ошибку времени компиляции. Я пытался сделать:
List<?> sample= Arrays.asList(1,2,3,4.14);
List<List<?>> lists = new ArrayList<List<?>>();
lists.add(Arrays.asList(1,2,3));
lists.get(0).add(5);
lists.add(Arrays.asList("four","five"));
System.out.println(sample.toString());
assert lists.toString().equals("[[1, 2, 3], [four, five]]");
Мои вопросы: 1) В первой строке, если я пишу:
List<?> sample= Arrays.asList(1,2,3);
Предупреждение не выдается здесь, но, как написано в предыдущем блоке, если Я пишу:
List<?> sample= Arrays.asList(1,2,3,4.14);
выдается предупреждение. Зачем?
2) Почему компиляции ошибка времени в четвертой строке:
lists.get(0).add(5);
Спасибо заранее.
Какое предупреждение и сообщение об ошибке сообщается? – WhiteKnight