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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 草上飞 中级黑马   /  2012-10-28 21:50  /  2613 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请问泛型的上限和下限,怎么回事,我有点晕,请问各位高手能用代码直接的告诉我吗,我会感激不尽的?

1 个回复

倒序浏览
本帖最后由 李连闯 于 2012-10-30 14:27 编辑

class GenericTest{ }

public class Test extends GenericTest {
     
        public static void main(String[] args) {
   
            Test test = new Test();//子类
            GenericTest g1 = new GenericTest();//父类
            
            //上限  (类本身及子类)的赋值均可以         还有或者(接口本身及其实现类)或者(接口本身及子接口) 这里没有给出例子均是相似的
            List<? extends GenericTest> list = new ArrayList<GenericTest>();//本类型  可以
            list = new ArrayList<Test>();//子类型  可以
            
             /*
              以上表明赋值没有问题,但是list的add方法都不可行 ,
             首先明确我要添加的是指定类型或者其子类型;
             对于 List<? extends GenericTest> list = new ArrayList<Test>();
                这里指定了参数化的类型是Test,如果GenericTest还有一个子类Test2,
                从声明的类型<? extends GenericTest>来看Test2(子类)的实例是可以添加的,
                但是从定义的角度new ArrayList<Test>()来看规定存放的类型必须是Test类型的,Test2实例不能添加,
                这是矛盾的,所以extends的list不能有添加方法
              
                既然不能add,但是可以通过赋值制来达到目的,所以可以得出上限的泛型只是用来引用指定类型或者其子类类型泛型对象使用的,
                示例如下:
              */
             List<Test> listTest1 = new ArrayList<Test>();
             listTest1.add(new Test());
             listTest1.add(new Test());
             listTest1.add(new Test());
             list = listTest1;
            
            //---------------------------------------------------------
            /*
            对于下限来讲,这里我要添加的还是指定类型或者其子类型;
            以List<? super GenericTest> list3 = new ArrayList<Object>();为例
            GenericTest或者其子类型都一定是<? super GenericTest>类型的(多态),
            GenericTest或者其子类型也都一定是Object类型的(多态),
            均满足,所以可以添加;
            但是如果要添加GenericTest的父类型一样会报错的(道理同extends部分)
            所以可以看出下限的泛型的用来添加指定类型及其子类型的时候接近于普通的泛型的使用;
            另一方面下限的泛型同样可用来引用指定类型父类型泛型的对象。
            相对于上限泛型,下限泛型功能性更强一些。
             */
            List<? super GenericTest> list3 = new ArrayList<Object>();
            list3.add(test);
            list3.add(g1);
            //list3.add(new Object());
            list3 = new ArrayList<GenericTest>();
            list3.add(test);
            list3.add(g1);
     }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马