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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张卫刚 中级黑马   /  2013-3-14 20:19  /  1547 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张卫刚 于 2013-3-14 23:23 编辑

public static void printColl(Collection<? extends Person> al) {
//1:泛型上限:上限写法是规定这样写的吗:? extends E,如果是,那这块就这么写? extends Person还看的明白

class Comp implements Comparator<Person>{
//2:泛型下限:下限写法是规定这样写的吗:? super E,如果是,那这块为什么不是(? super Person)这样写呢?而是直接写成了Person

//3:尤其对泛型下限很是不解,如果说下限限制了,那person有个子类Student,为什么不是按格式写成(? super Student)呢?到底怎么样理解泛型下限的限制呢?比如上限最大到父类,那(? extends Person)很容易理解,但是下限如果说是Student是限制下限的,那下限应该写成(? super Student)啊,为什么要是? super Person呢? 而且还把写法直接写成person了,为什么?
请理解清晰的同学帮忙分析下,我在好好理理思路,

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
第一个理解成继承 好说    ? extends E 源于子类

第2个 理解成父类 这么讲 ? super E    是E的高等类,即限定 子类的最低级别  
如下:定义3个类 Person, Student ,Worker
class Person()       class Student() extends Person    class Worker() extends Person            
{                         {                                               {
     void sleep()      void  study()                 void work()
}                         }                                               }

Person p = new Person(); //很清晰

Person s =new Student(); // 只能定义 Student 子类对象 s

Person w =new Worker(); // 也只能定义 Worker 子类对象 w

能理解 p.study() 与 p.work() 不能被调用么?不难吧。

问题就是 s.sleep()与 w.sleep() 都可以实现,定义泛型<Person> 后Student 和 Work 都可以调用Person的方法,继承了,当然可以实现。

?super Student  与 ? super Worker 是不是 范围就都可以指向Person ,将 Student s 与Worker w 两个子类对象,通过Person 类 来定义这两个子类对象 ,可以再回头去看
                                                                                                             s 与w 定义,可以了解
对象 s 与 w 都可以调用父类方法 sleep(),那么将此泛型定义为<Person> 是不是就可以接 s 与 w 来实现 。就好像定义了一个<T>  只要是T 或者 T 的子类 都可以调用T的方法么。

至于 ? super Person  这样不必再说了吧,下限是Person的话,你怎么接收 Person的子类 Student 和Worker 呢?

希望对你有所帮助,这样的抽象内容,最好还是多看看,别接着往后看,理解透了,其实后面的内容更容易,无非就是定义了一些固定的用法 以及使用技巧




评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
谢谢啊,说的很详细,但我郁闷(? super E)的两个点,你没说清:
1:假如现在就是person吧,person有两个子类:student,worker,那对下限一词来说这三个谁是下限?student? 按我的理解即然下限限制了 那这个E就应该是下限的类
2:写法上,为什么直接写成person了,为什么不写成? super person

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
张卫刚 发表于 2013-3-14 21:51
谢谢啊,说的很详细,但我郁闷(? super E)的两个点,你没说清:
1:假如现在就是person吧,person有两个子 ...

兄弟你够牛,讲了那么多,子类就是下限,无论Student Worker ,都可以接收进泛型,都可以调用Person共有方法 ,定义下限 ,像你这么定义:?super Person ,那你是不是就是说,只能接收Person 及其 父类,还能用子类调用Person类方法么?显然不可以吧,因为你根本就没有接收子类。

这些内容就是太抽象,想办法 建立模型,不然 ,建议看15天的泛型限定2的视频内容
你就多看看 老毕 的 “猪狗 存放圈养论”,看看哪个呲牙,哪个疯吧:lol


回复 使用道具 举报
恩冒似有点明白了,今天看了两边呢?感觉毕老师图个图最好了{:soso_e143:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马