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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

楼主我来终结你的疑惑吧,相信毕老师讲的,添加时用上限,取出时用下限,这句没理解吧,理解了就很好判断了。
正确的代码运行结果不说了,懂多态就很好解释了,我只说错误的这个。
public static void show(Collection<? super Student> c){
        Iterator<? super Student> it=c.iterator();
        while(it.hasNext()){
            it.next().run();
        }
    }
其实原因就是二楼那美女说的原因,你不知道?里有没有run,调用run当然就错了,好吧再具体点就是,
改成((Person)it.next()).run();编译就能通过,因为调用方法之间明确了类型,里面有run,但是这样就失去泛型
的意义了,因为如果传入object类,编译也能通过,但是运行失败。
你说这里不能用下限,当然不能用下限,因为这里是往集合里面添加元素呢。下限还有什么用呢,好吧这和object里面有多少方法无关,即使object没有方法,
下限依旧很有用,下限是在从集合取元素时用的,很有用。说起来有好多人不理解,为了让更多人看到我再开个贴吧,你去我帖子里看。
回复 使用道具 举报
x378320002 发表于 2013-6-13 10:00
你这个理解的fun功能,要么不定义功能,要么只定义Object里的功能啊,是不是等着别人用时再传参数去覆盖 ...

其实就是:定义函数中的形参时,范围要大,那么调用该函数,给形参传递实参时,能接收的实参范围就更广,比如说,你定义一个函数fun(Object obj){},该函数的形参因为是Object类型,所以它能接收一切类型的实参对象;而fun(<? super Student> s),那么因为该函数的形参是Student及其父类,就便于接收Student类的对象。
回复 使用道具 举报
这个我不懂哦,楼下的来完成吧
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马