【问题标题】:Why cast to Closeable first?为什么要先转换为 Closeable?
【发布时间】:2011-03-18 20:15:02
【问题描述】:

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

((Closeable) some_obj).close();

some_obj 显然是实现 Closeable 接口的类的实例。我的问题是,为什么他们在调用 close() 之前先将 some_obj 转换为 Closeable。 我不能这样做吗

some_obj.close();

【问题讨论】:

    标签: java interface casting idioms


    【解决方案1】:

    假设some_obj编译时 类型实现Closeable,那么是的,你可以。

    只有当你有一个知道实现Closeable的对象时才需要这个,但是编译时类型更通用(最明显的例子是Object)或以其他方式“不同”(例如不同的界面)。

    有趣的是,在 C# 中,转换为接口类型可以有所作为,即使编译时类型已知会实现接口,因为显式接口实现。如果有人关心,我可以提供更多细节,但我只是想我会把它扔在那里。

    【讨论】:

    • 从技术上讲,它可能不是“更一般”的东西,只是“不同”的东西(Closeable 的兄弟类型)。
    • 技术上,技术上,它可能根本与 Closeable 无关(在非演员版本中);-)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      我们可能永远不知道为什么代码是这样写的。它可能是以前的代码化身遗留下来的,其中some_obj 的声明类型不同。可能是开发者有一些风格问题......

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

      【讨论】:

        猜你喜欢
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 1970-01-01
        • 2014-10-08
        • 2013-01-11
        相关资源
        最近更新 更多