代码如下:
List<String> l1=new ArrayList<String>();//实例化一个ArrayList对象
l1.add("成员");//在集合中添加内容
List<?> l2=l1;//使用通配符
List<?> l3=new LinkedList<Integer>();
System.out.println(l2.get(0));//获取集合中第一个值
List<?>类型的对象可以接受String类型的ArrayList集合,也可以接受Integer类型的LinkedList集合。也许会有人疑问,List<?>l2=l1语句与List l2=l1存在何种本质区别?这里需要注意的是,使用通配符声明的名称实例化的对象不能对其加入新的信息,只能获取或删除。例如:
l1.set(0,"成员改变");//没有使用通配符的对象调用set()方法
//l2.set(0,"成员改变");//使用通配符的对象调用set()方法,不能被调用
//l3.set(0,1);
l2.get(0);//可以使用l2的实例获取集合中的值
l2.remove(0);//根据键名删除集合中的值
从上面可以看出,由于对象l1是没有使用A<?>这种形式初始化出来的对象,所以它可以调用set()方法改变集合中的值,但l2与l3则是通过使用通配符的方式创建出来的,所以不能改变集合中的值。 |