A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马张涛 中级黑马   /  2012-8-29 11:52  /  1873 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void testAdd(Collection<?> c)
{
         c.add(null); //编译通过
         c.add(123);//这个通不过,因为Collection接收对象类型不确定
         c.add((Object)12);//这个,为什么也不行,不是转成Object的了,因为任何类都是Object子类啊
}
}

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

4 个回复

倒序浏览
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());
                        }               
        }

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

回复 使用道具 举报
public static void testAdd(Collection<?> c)
{
         c.add(null); //编译通过
         c.add(123);//这个通不过,因为Collection接收对象类型不确定
         c.add((Object)12);//这个,为什么也不行,不是转成Object的了,因为任何类都是Object子类啊
}
}
正因为任何类都是Object的子类,具体应该是哪个子类呢,编译器根本就不清楚,所以这样当然也是不能通过了。
正如多态中向上向下转型的一些特点,向上的时候通用某些方法,向下的时候需要进行强制类型转换。
还有Java中的泛型也是出于类型安全机制的考虑等。

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

回复 使用道具 举报
public static void testAdd(Collection<?> c)
{
         c.add(null); //编译通过
         c.add(123);//这个通不过,因为Collection接收对象类型不确定
         c.add((Object)12);//这个,为什么也不行,不是转成Object的了,因为任何类都是Object子类啊
}
}
你的 这个? 是个泛型问题啊   
就是说这样
Object o=new String();
这样是向下转型问题
他只能实现String 里的 方法 啊  
好好想一下 多态。
回复 使用道具 举报
明白了,问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马