黑马程序员技术交流社区

标题: 谁能用自己的话总结一下泛型上下限呢 [打印本页]

作者: 小周务商    时间: 2014-5-10 10:18
标题: 谁能用自己的话总结一下泛型上下限呢
我看了高新技术部份泛型上下限。理解不是很透彻。
希望哪位可以用自己的话术来和我说说。谢谢了。我不要长篇大论的那种。我要的是能自己的话来理解。
就当是一次老师提问了。
作者: skill20    时间: 2014-5-10 10:41
<?>这个是所以类型。
<? extends T>只能是T或它的子类。
<? super T>只能是T或它的父类。
3句话一起来理解,明白了不?
作者: 为梦想而活着    时间: 2014-5-10 12:10
泛型是对普通方法更加泛化的实现,这种泛型类是适用于所有类或者部分类,一般情况下是使用与部分类。对这些类会存在某些限制,而泛型类并不关心类的具体类型是什么,而在乎它是否可以执行某个方法!
作者: 年轻的老头    时间: 2014-5-10 12:52
水果类:
class Fruits{
}
苹果类:
class Apple extends Fruits{
}
青苹果类:
class GreenApple extends Apple {
}
梨子类:
class Pear extends Fruits{
}
向上造型一个泛型对象的引用 <?extends T>
向下造型一个泛型对象的引用 <? super T>

List<?extends Fruits> fruits = new ArrayList<Apple>();
fruits.add(new xxx());//xxx表示任意类型,add形参类型是Fruits的的类型或是Fruits的子类,但是具体是那个类型不确定,所以编译错误
Fruits aFruit = fruits.get(0);//get方法返回的类型是Fruits的的类型或是Fruits的子类, 所以可以用父类引用接收子类的引用,编译通过
所以说<?extends T>用于读取数据;

List<? super Apple> fruits = new ArrayList<Fruits >();
fruits.add(Apple或 Apple子类对象的引用); //add形参类型是Apple的的类型或是Apple的父类,所以能接收所有的Apple或 Apple子类对象的引用)
Apple aApple = fruits.get(0); //get方法返回的类型是Apple的的类型或是Apple的父类,但是具体是那个类型不确定,所以也没方法指定一个类型引用来接收它,自然编译错误
所以说<? super T>用于写入数据;

总结:
如果你想从一个数据类型里获取数据,使用 ? extends 通配符
如果你想把对象写入一个数据结构里,使用 ? super 通配符
如果你既想存,又想取,那就别用通配符。

重点理解这句话:父类的引用可以接收子类的实例对象的引用(多态性)

作者: 没壳的蜗牛    时间: 2014-5-10 13:06
上限<?extends T>表示只能是T或T的子类
下限<? super T>  表示只能是T或T的父类
作者: 小周务商    时间: 2014-5-10 13:44
skill20 发表于 2014-5-10 10:41
这个是所以类型。

这个我明白,跟张老师里面的一样。我还是需要多消化一下。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2