黑马程序员技术交流社区
标题:
向Collection<?>容器添加字符
[打印本页]
作者:
黑马张涛
时间:
2012-8-29 11:52
标题:
向Collection<?>容器添加字符
public static void testAdd(Collection<?> c)
{
c.add(null); //编译通过
c.add(123);//这个通不过,因为Collection接收对象类型不确定
c.add((Object)12);//这个,为什么也不行,不是转成Object的了,因为任何类都是Object子类啊
}
}
作者:
曹操
时间:
2012-8-29 17:29
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());
}
}
作者:
黄珊珊
时间:
2012-8-30 14:20
public static void testAdd(Collection<?> c)
{
c.add(null); //编译通过
c.add(123);//这个通不过,因为Collection接收对象类型不确定
c.add((Object)12);//这个,为什么也不行,不是转成Object的了,因为任何类都是Object子类啊
}
}
正因为任何类都是Object的子类,具体应该是哪个子类呢,编译器根本就不清楚,所以这样当然也是不能通过了。
正如多态中向上向下转型的一些特点,向上的时候通用某些方法,向下的时候需要进行强制类型转换。
还有Java中的泛型也是出于类型安全机制的考虑等。
作者:
孙铭泽
时间:
2012-8-30 16:25
public static void testAdd(Collection<?> c)
{
c.add(null); //编译通过
c.add(123);//这个通不过,因为Collection接收对象类型不确定
c.add((Object)12);//这个,为什么也不行,不是转成Object的了,因为任何类都是Object子类啊
}
}
你的 这个? 是个泛型问题啊
就是说这样
Object o=new String();
这样是向下转型问题
他只能实现String 里的 方法 啊
好好想一下 多态。
作者:
黑马张涛
时间:
2012-8-30 18:02
明白了,问题已解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2