Тип Предупреждение о безопасности - PullRequest
0 голосов
/ 23 марта 2012

В книге «Дженерики и коллекции Java» Мориса Нафталина, Филиппа Уодлера, я проходил через ограничения Дженерики и столкнулся с сомнением.Может быть, это ответ в книге, но я думаю, что я смущен лой.
В следующем коде:

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

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 23 марта 2012

Существует исключение времени компиляции, потому что lists.get(0) возвращает List<?>

Вы не знаете, какой тип этого списка, вы знаете, что вы можете получить элементы из него (это будет по крайней мере Object), но вы не можете ничего в него вставить (так как вы не уверен, что он подойдет.

Что бы добавить, если бы вы написали вместо:

List<List<?>> lists = new ArrayList<List<?>>();
lists.add(new ArrayList<String>());
lists.get(0).add(5);
lists.add(Arrays.asList("four","five"));

У вас есть ArrayList<String>, и вы пытаетесь добавить в него число. Поэтому, чтобы избежать ошибок такого рода (а также потому, что проверка выполняется во время компиляции), вы не можете добавлять вещи, если не уверены, что это сработает.


Что касается вашего предупреждения, у меня его нет.

0 голосов
/ 23 марта 2012

2) Почему в четвертой строке есть ошибка времени компиляции:

lists.get (0) .add (5);

потому что вы определили List> lists = new ArrayList> (); и вы пытаетесь добавить простое целое число 5 в список. Вот почему IDE выдает ошибку компиляции.

0 голосов
/ 23 марта 2012

1) Эта строка не должна давать предупреждение (и это не так, когда я пытаюсь это сделать). Какое предупреждение вы видите?

2) Произошла ошибка времени компиляции, потому что тип lists.get(0) равен List<?>, а не List<Integer. Это означает, что компилятор не знает, может ли список содержать целое число ...

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