- /*①*/ Vector<? extends Number> a = new Vector<Integer>();
- a.add(23);//错误。因为此时编译器并不知道你的a中装的是Integer还是Number,如果你是Number类型的,就不可以添加Double类型的。
- a.add(new Double(11.1));//错误。道理同上。如果是Integer,就不可以添加Double。
-
- /*①*/ Vector<? super Number> a2 = new Vector<Object>();
- a2.add(new Integer(23));//正确。虽然编译器不知道你装的是什么,但是不管你是Object,还是Number都可以添加。因为Integer是Object的子类,而Number也是Object子类
- a2.add(new Double(11.1));//正确。道理同上。Double是Object的子类,而Number也是Object子类
- /*①*/ Vector<? super Integer> c = new Vector<Number>();
- c.add(23);//正确。此时编译器不知道你c中装的是什么。如果是Integer,可以添加23,如果是Number,也可以添加23
- c.add(new Long(123l));//错误。同上。如果是Integer,不可以添加Long,对吧?
-
- /*首先,我举得你举的这些例子都很经典,可以用来当教学案例了
- *其次,我做一下总结。
- *如果要使用add方法,一定要?和T都满足的元素才可以添加,否则会编译失败——原因是编译器并不知道a中是什么类型的
- *如果真的要追求根本原因。。。我也解释不清楚,可能要看源码和他的内存结构吧。。。
- * */
复制代码 |