假设有一个继承体系,父类是Employee,它有很多子类代表不同的雇员,其中一个子类是Manager.
然后Manager下面也有很多子类,代表不同的部门经理.在使用泛型进行编程的时候,有下面三种形式:
Pair<Manager>
Pair<? extends Manager>
Pair<? super Manager>其中第一种形式和第二种形式我已经搞清楚了,关键是第三种形式我理解不了,我怎么看<? super Manager>都觉得和第二种形式<? extends Manager>一样,大家能帮我解释下<? super Manager>和<? extends Manager>的区别是什么么,讲的细点,谢谢大家!

解决方案 »

  1.   

    本帖最后由 java2000_net 于 2008-11-11 10:58:00 编辑
      

  2.   

    谢谢!应该是讲的很清楚了,不过我还要消化下.目前的理解是:
    <? extends Manager>取的是从Manager开始的继承体系的下段,
    <? super Manager>取的是从Manager开始的继承体系的上段.
      

  3.   

    可以支持到 Employee 的子类
    在继承树上,能支持 Manager 父类的那个节点下的所有分支
      

  4.   

    包括了 Manager 下的分支。
      

  5.   


        class ListUse{
            /**
             * 以int格式打印任意一种Number型list的值
             */
            public void useUpper(List<? extends Number> list){
                // 1. list中存入的一定是Number的子类
                // 2. list中取出的只知道是Number,而无法区分是Integer还是Double等
                // 3. 无法向List中add数据,因为我们不知道List中存的到底是什么Number的哪个子类.
                // 结论:  以父类的形式无差别的处理各种子类型泛型中的子类型数据
                //       (以父类Number类型无差别的处理List中的子类型对象.)
                for(Number n:list){
                    System.out.println(n.intValue());
                }
            }
            /**
             * 为任意一个Integer父类型的List容器加入10个随机的int数据. 
             */
            public void useLower(List<? super Integer> list){
                // 1. list中一定可以存放Integer,因为那里定义的是Integer的父类
                // 2. list中读出的数据未必是Integer.只有一点是肯定的,那就是它一定是个Object.
                // 3. 为List提供的数据必须是Integer或它的子类型,因为无法确定List中规定的类型是Number的哪一级父类型.
                // 结论: 将某一类对象无差别的提供给它的各种父类型的泛型使用
                //      (将Integer对象无差别的提供给各种父类型List使用)
                Random rnd=new Random();
                for(int i=0; i<10; i++){
                    list.add(rnd.nextInt());
                }
            }
        }