public static void testAdd(Collection<?> c)
{
c.add(null); //编译通过
c.add(123);//这个通不过,因为Collection接收对象类型不确定
c.add((Object)12);//这个,为什么也不行,不是转成Object的了,因为任何类都是Object子类啊
}
}
因为楼主一开始你已经说明泛型里面是?通配符 就表示传入的类型不确定了
下面可以参考以下总结
泛型通配符:不带泛型也是可以的,因为新的可以兼容前面的,因为泛型擦除之后它还是Object注意区分T t代表某一种
实现代码:
Public static void main(String[] args){
ArrayList<Student> al=new ArrayList<Student>();
Al.add(new Student("lisi",21));
Al.add(new Student("lisi2",22));
Al.add(new Student("lisi3",23));
ArrayList<Worker> al2=new ArrayList<Worker>();
Al.add(new Student("lisiso",23));
Al.add(new Student("lisiss",23));
Al.add(new Student("lisisdsdf",23));
ArrayList<String> al3=new ArrayList<String>();
printCollection(a1);
printCollection(a2);
}
Public static void printCollection(Collection<? Super Student> coll)
{
Iterator<? Super Student> it=coll.iterator();
While(it.hasNext()){
Student stu=it.next();
Student p=it.next();
Sop(p.getName()+p.age());
Object obj=it.next();
Sop(obj.toString());
}
}
对集合中的元素进行迭代的功能,因为打印集合中的元素类型是不确定的,无法明确,可以使用泛型中的通配符来完成,该通配符用?来标示,
如果要对操作的类型进行限定,只操作一部分类型时,可以使用泛型的高级功能,泛型的限定。
? Extends E:可以接收E类型和E的子类型。
? SuperE:可以接收E了性或者E的父类型。
实现代码:
Public static void printCollection(Collection<? Extedns Person> coll){
Iterator<? extends Person> it = coll.iterator();
while(it.hasNext()){
// Student stu = it.next();
Person p = it.next();
System.out.println(p.getName()+"-----"+p.getAge());
}
} |