代码之家  ›  专栏  ›  技术社区  ›  dertoni

为什么要先去亲近的地方?

  •  3
  • dertoni  · 技术社区  · 14 年前

    在阅读一些Java源代码时,我遇到了这一行:

    ((Closeable) some_obj).close();
    

    一些对象显然是实现可关闭接口的类的实例。我的问题是,为什么在调用close()之前先将一些对象强制转换为closeable。 我不能就这么做吗

    some_obj.close();
    
    3 回复  |  直到 14 年前
        1
  •  7
  •   Jon Skeet    14 年前

    假设 编译时间 类型 some_obj 器具 Closeable 是的,你可以。

    如果你有一个物体 了解实施情况 可关闭的 但是在编译时类型更一般的地方(最明显的例子是 Object )或者“不同”(例如不同的接口)。

    正如我们感兴趣的一样,在C中,转换为接口类型 可以 由于显式的接口实现,即使已知编译时类型来实现接口,也要做一个改变。如果有人关心的话,我可以提供更多的细节,但我只是想把它扔到外面去。

        2
  •  3
  •   user166390    14 年前

    如果 已知编译时类型 变量的 some_obj 包含方法 close() 然后是的。

        3
  •  2
  •   Stephen C    14 年前

    听起来排版是不必要的。(您可以通过尝试编译删除了假定冗余类型转换的类来确认这一点。)

    我们可能永远不知道为什么代码是这样写的。它可能是从代码的前一个版本遗留下来的,其中声明的类型 some_obj 是不同的。可能是开发人员有一些风格问题…

    如果删除多余的强制转换,代码的可读性可能会提高,但实际上并没有造成任何损害。我希望Java编译器或JIT编译器会优化它。即使没有,冗余类型转换的成本也很可能是微不足道的。