楼主我来终结你的疑惑吧,相信毕老师讲的,添加时用上限,取出时用下限,这句没理解吧,理解了就很好判断了。
正确的代码运行结果不说了,懂多态就很好解释了,我只说错误的这个。
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没有方法,
下限依旧很有用,下限是在从集合取元素时用的,很有用。说起来有好多人不理解,为了让更多人看到我再开个贴吧,你去我帖子里看。 |