Дженерики Java - инициализация ArrayList

Известно, что arraylist init. должно быть так

ArrayList<A> a = new ArrayList<A>();
ArrayList<Integer> a = new ArrayList<Number>(); // compile-time error

, так почему же Java это позволяет?

1. ArrayList<? extends Object> a1 = new ArrayList<Object>();
2. ArrayList<?> a2 = new ArrayList<Integer>();

тогда, если они верны, почему это не разрешено?

1. a1.add(3);
2. a2.add(3);

сообщение компилятора следующее: Метод add (int, capture # 1-of? Extends Object) в типе ArrayList не применим для аргументов ( int)

более общие сведения

  1. a1.add(null e);
  2. a2.add(? e);

Я читал об этом, но приятно слышать от вас. спасибо

другой забавный момент:

 ArrayList<ArrayList<?>> a = new ArrayList<ArrayList<?>>(); // correct
 ArrayList<?> a = new ArrayList<?>(); // wrong. I know it's reason but I have some 
question in my mind that mentioned above 
20
задан 20 December 2010 в 19:22
поделиться