为什么首先投射到Closeable?

时间:2010-07-21 07:20:18

标签: java interface casting idioms

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

((Closeable) some_obj).close();

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

some_obj.close();

3 个答案:

答案 0 :(得分:7)

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

如果你有一个知道已经实现Closeable的对象,你只需要这个,但编译时类型更通用(最明显的例子是{{ 1}})或“不同”(例如不同的界面)。

正如感兴趣的那样,在C#中,由于显式接口实现,即使已知编译时类型实现接口,对接口类型的强制转换也可以有所作为。如果有人关心,我可以提供更多细节,但我只是想把它扔出去。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

听起来像是没有必要进行类型转换。 (您可以通过尝试编译具有所谓的冗余类型转换的类来确认这一点。)

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

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