【发布时间】:2011-05-28 10:27:33
【问题描述】:
众所周知,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);
编译器消息是:ArrayList 类型中的方法 add(int, capture#1-of ? extends Object) 不适用于参数 (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
【问题讨论】:
-
你能做类似
a1.add(new Integer(3));的事情吗? -
@Gabe 你只能做 a1.add(null)。 a1.add(3) 应该转换为 Integer 对象,但编译器只看到 2.add(?e) 并且这里只允许 add(null)