黑马程序员技术交流社区

标题: 向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