在阅读一些Java源代码时,我遇到了这一行:
((Closeable) some_obj).close();
some_obj显然是实现Closeable接口的类的实例。我的问题是,为什么他们在调用close()之前首先将some_obj强制转换为Closeable。 我不能这样做
some_obj.close();
答案 0 :(得分:7)
假设编译时类型的some_obj
实现了Closeable
,那么是的,你可以。
如果你有一个你知道已经实现Closeable
的对象,你只需要这个,但编译时类型更通用(最明显的例子是{{ 1}})或“不同”(例如不同的界面)。
正如感兴趣的那样,在C#中,由于显式接口实现,即使已知编译时类型实现接口,对接口类型的强制转换也可以有所作为。如果有人关心,我可以提供更多细节,但我只是想把它扔出去。
答案 1 :(得分:3)
如果变量some_obj
的已知编译时类型包含方法close()
,则为是。
答案 2 :(得分:2)
听起来像是没有必要进行类型转换。 (您可以通过尝试编译具有所谓的冗余类型转换的类来确认这一点。)
我们可能永远都不知道为什么代码是这样编写的。它可能会遗留在代码的前一个版本中,其中声明的some_obj
类型不同。可能是开发人员有一些风格问题......
虽然如果删除了多余的强制转换,代码可能会提高可读性,但它实际上并没有造成任何伤害。我希望Java编译器或JIT编译器能够优化它。即使没有,多余的类型转换的成本也很可能是微不足道的。