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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林康春 黑马帝   /  2012-7-15 00:22  /  1462 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/**
泛型的通配符和约束 ,就是这个-----------> ?
*/
import java.util.Collection;
import java.util.Iterator;
import java.util.ArrayList;
class  Demo5
{   

        // 自定义一个函数,该函数中遍历任意一个集合的任意类型的元素对象
        public static void print( Collection<?extends Number> coll )
        {
            System.out.println("Hello World!");
                Iterator it=coll.iterator();
                for (;it.hasNext() ; )
                {
                        System.out.println(it.next());
                }
               


                coll.remove(12);
                coll.clear();
        }


        public static void main(String[] args)
        {
                //System.out.println("Hello World!");
                ArrayList a=new ArrayList();
                a.add(123);
                a.add(1322);
                a.add(1232);
                a.add( new Object());
                a.add("1232");

                print(a);

        }
}
/*
运行结果:
Hello World!
123
1322
1232
java.lang.Object@de6ced
1232

疑问:
     a.add( new Object()),这个new Object()没和上面参数Collection<?extends Number> coll矛盾吗?
         怎么能打印出来?
         还有现在的这个ArrayList 的a,怎么能继承Number?
*/

3 个回复

倒序浏览
本帖最后由 周恺 于 2012-7-15 08:39 编辑

这是因为你的ArrayList集合没有做出泛型限定,所以这个ArrayList集合可以是任意类型的,
同时也包括Collection<?extends Number>允许的类型.
而Collection<? extends Number>的泛型检查取决于ArrayList的泛型
如果ArrayList加上了泛型以后,编译器就可以通过Collection<? extends Number>
进行类型检查了.你可以用ArrayList<String>试试,看还能让你编译通过吗.
这就好比你长着一张大众脸进小区,小区保安不知道你是好人还是坏人,只好放你进去.
如果你长得凶神恶煞的,一看就知道不是好人,保安自然会把你拦下.

所以我们在使用集合的时候,都应该习惯性的加上泛型检查,向一个集合中加入不同类型的对象是不建议的.
回复 使用道具 举报
(1)ArrayList未声明操作的类型,我们可以把它的操作类型假定为?,所以其集合内可以装入任意类型,限定条件:必须为Object对象或其子类对象;
   我们指导Object为所有类的超类,那么new Object()当然能传入ArrayLis集合中
(2)coll为Collection<?extends Number>的实例对象,new Object()为ArrayList里面的元素,两者扯不上直接的关系
     有联系的是ArrayList的类型限定为<?>,Collection的类型限定为<? extends Number>
(3)程序中没有声明与类型限定有关的父类Number及其子类,我们也可以把<? extends Number>认为是一个通配符?
(4)根据多态,有如下写法:Collection c=new ArrayList();所以子类对象能传给父类,传给父类的过程中,根据父类操作类型,也将子类的泛型限定为<? extends Number>

=======下面是回答LZ的疑问:
a、new Object()是ArrayList的一个元素,根据此句,就把ArrayList的泛型限定想象为Object,Collection是ArrayList的父接口,因为原因(3)知道此时相当于这样的效果:
   Collection<?> coll=new ArrayList<Object>();
b、a是对象,Number是类型,只能说a里面装入的类型是否与Number有关,又因为原因(3)知道Collection是可以接受任意操作类型的

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
最近很忙,忘记回帖了。
明白了,原来是自己不够小心,得好好总结一下。
谢谢你们了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马