编绎不通过,报错,classname不能转换成Object,为什么??
6条回答 默认 最新
- wks1986 2011-08-06 22:18关注
短回答:Java里面,白马非马。[url]http://cloverprince.iteye.com/blog/707631[/url]
长回答:泛型参数会造成一些“副作用”,会影响“是不是子类”的判定。
比如:
List有一个方法,叫add(Object e),向这个list里加入一个Object类型的对象。所以:
[code="java"]List lst = ...;
list.add(new Date()); // 这个应该是合法的,因为Date是Object的子类。
[/code]对于ArrayList:
[code="java"]ArrayList lst2 = new ArrayList();
lst2.add("foo"); // 这个应该是可以的,因为"foo"是String
[/code]但是,如果假设ArrayList是List的子类,那么:
[code="java"]ArrayList lst2 = new ArrayList();
List lst = lst2; // 假设ArrayList是List的子类,所以可以这样赋值。
lst.add("foo"); // 这个应该是可以的,因为"foo"是String,也是Object
lst.add(new Date()); // 危险!!!!!!
[/code]
看“危险!!”那一行。
对于lst,因为lst是List型,所以这样add是可以的,因为Date是Object的子类。
但是,因为lst2,是ArrayList,这样的add(new Date())又是不行的,因为lst2只能存放String。问题就出在“假设ArrayList是List的子类”。
根据[b]里氏替换原则[/b],子类必须支持基类的全部操作。但是,这里子类ArrayList显然不能允许基类的这种add(Object)操作。所以不是子类。
事实上List lst = lst2;这一行是编译通不过的,这样做会导致下面那个不安全的操作。
我的博客有进一步讨论。这个争论其实在Java加入泛型的时候就有了。 [url]http://cloverprince.iteye.com/blog/707631[/url]
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥100 set_link_state
- ¥15 虚幻5 UE美术毛发渲染
- ¥15 CVRP 图论 物流运输优化
- ¥15 Tableau online 嵌入ppt失败
- ¥100 支付宝网页转账系统不识别账号
- ¥15 基于单片机的靶位控制系统
- ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
- ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
- ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
- ¥15 手机接入宽带网线,如何释放宽带全部速度