在阅读一些Java源代码时,我遇到了这一行:
((Closeable) some_obj).close();some_obj显然是一个实现Closeable接口的类的实例。我的问题是,为什么他们先将some_obj转换为Closeable,然后再调用close()。我就不能这样做吗
some_obj.close();发布于 2010-07-21 15:21:36
假设some_obj的编译时类型实现了Closeable,那么可以这样做。
只有当你有一个已经实现了Closeable的对象,但是编译时类型是更通用的(最明显的例子是Object)或其他“不同的”(例如,不同的接口)时,你才需要它。
有趣的是,在C#中,由于显式的接口实现,即使已知编译时类型实现了接口,对接口类型的强制转换也会有所不同。如果有人关心,我可以给出更多细节,但我只是想把它抛出去。
发布于 2010-07-21 15:22:25
如果变量some_obj的已知编译时类型包含方法close(),则为yes。
发布于 2010-07-21 15:45:04
听起来类型转换是不必要的。(您可以通过尝试编译类来确认这一点,其中删除了假定的冗余类型转换。)
我们可能永远不会知道为什么代码是这样写的。它可能是在声明的some_obj类型不同的代码的前一个版本中遗留下来的。可能是开发人员有一些风格上的问题...
如果去掉了冗余的强制转换,它(可能)会提高代码的可读性,但它实际上并没有造成任何危害。我希望Java编译器或JIT编译器会对其进行优化。即使不是这样,冗余类型转换的成本也很可能微不足道。
https://stackoverflow.com/questions/3297038
复制相似问题