2012-03-23 2 views
0

В книге «Дженерики 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); 

Спасибо заранее.

+0

Какое предупреждение и сообщение об ошибке сообщается? – WhiteKnight

ответ

3

Существует время компиляции, потому что исключение 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

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

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

0

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

lists.get (0). добавить (5);

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

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