azhu202 2011-08-04 22:58
浏览 737
已采纳

List<Object> list = new ArrayList<Classname>();

编绎不通过,报错,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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度