黑马程序员技术交流社区
标题:
关于泛型的上限以及下限的问题
[打印本页]
作者:
覃宏海
时间:
2012-9-12 22:50
标题:
关于泛型的上限以及下限的问题
本帖最后由 覃宏海 于 2012-9-13 15:52 编辑
新人求教
对于泛型的下限<? super E>我很难理解
如果A extends B,那么B在有A的方法的同时A还有它自己特有的方法
那么如果原来泛型为<A>,改成<B>后,不就不能用A的方法了吗?
是不是我对泛型的理解错误了?
作者:
李菁
时间:
2012-9-12 23:06
对于泛型的下限<? super E>我很难理解
这句话的意思是,该类型必须是E或者E的父类
父类B可以有自己的方法,子类A可以重写父类的方法,但是父类不能调用子类的方法
作者:
张飞年
时间:
2012-9-13 00:16
本帖最后由 张飞年 于 2012-9-13 00:21 编辑
<? super E> 这是泛型的下限,也就是说对象的类型只接收E类型或者是E类型的父类类型,这里的?为通配符。下限通常在对集合中的元素进行取出操作时进行使用。
A extends B,如果泛型是<A >则能使用的方法是A自己的和继承的方法,<B>只能使用自己的方法,这没错,我们想清楚的是泛型是一种对数据类型的限制,是为了保证数据的安全操作,避免一些不必要的错误,如转换异常之类的。上限一般在存储元素的时候使用,因为这样取出都 是按照上限类型来运算的,不会出现类型安全隐患。
关于泛型的理解,暂时可以这样理解:
泛型是一种限制和检查类、方法、成员变量的数据类型的“泛泛而说的类型,相当于类型的占位符,只告诉编译器说:这里方的是一个类型,具体什么类型编译或执行的时候再自动确定吧。就是这样~~举例说明吧:
人 ren=new 人();
不加泛型时什么样的人都可以。
人<明星类型的人> ren=new 人<明星类型的人>();
加了泛型就是说我只要new一个明星类型的人类。
//泛型的重点是类型检查,如在以前的ArrayList中可以放入所有对象而不会进行类型检查,所以
//当下面代码时会有错
ArrayList list=new ArrayList();
Apple a=new Apple();
Orange o=new Orange();
list.add(a);list.add(o);
//当通过list.get(int index)来获取对象时,它返回的是一个Object的对象。你要进行相应的类型判断才能正确使用这个通过get返回的对象。
//而泛型的好处在于,在add()方法的时候就进行了类型的检查
//如
ArrayList<Apple> list=new ArrayList<Apple>();
Apple a=new Apple();
Orange o=new Orange();
//当list.add(a)时没问题,而list.add(o)的时候就会报错了。
//这是泛型的一个好处,另外一个好处就是简化代码
//如方法 T do(T test);中do方法能适用于大部分的数据类型。
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2