【问题标题】:Why does this compile?为什么会这样编译?
【发布时间】:2010-12-02 11:47:59
【问题描述】:

今天早些时候,我在调试一些代码时发现类似下面的代码不会引发编译时异常,这让我大吃一惊:

 public Test () { 
     HashMap map = (HashMap) getList(); 
 }

 private List getList(){
     return new ArrayList();
 }

您可以想象,ClassCastException 在运行时被抛出,但有人可以解释为什么将List 转换为HashMap 在编译时被认为是合法的吗?

【问题讨论】:

标签: java exception casting


【解决方案1】:

因为可以想象getList() 可能会返回HashMap 的子类,它也实现了List。不太可能,是的,但可能,因此是可编译的。

【讨论】:

  • +1:显式转换基本上是程序员告诉编译器“我知道我在做什么,所以按照我的方式做”的情况 - 如果编译器不知道你'真的真的错了,它会如你所愿。嗯,这是向我解释的一种方式。
  • 是的,如果将List 替换为ArrayList,编译器会报错。
  • @weiji:这只是在一定程度上是正确的,远不如在 C 或 C++ 中正确。 java编译器只会给你这么多的绳子,如果A不可能是B的实例,它就不会编译。
  • 谢谢。查看 JLS (java.sun.com/docs/books/jls/third_edition/html/…),在阅读您的解释后看起来很明显。因此,像String 这样的最终类不能在编译时强制转换,因为不可能有一个子类可以实现List
【解决方案2】:

一方面,List 是一个接口。没有理由不存在也实现 List 接口的 HashMap 的子类。在这种情况下,它是完全有效的。

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2022-07-06
    • 2020-03-28
    • 1970-01-01
    • 2018-10-15
    • 2011-02-03
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多