从对象到布尔值的强制转换是有效的 Java 语言吗?
2022-09-04 20:36:08
我在工作中偶然发现了一个旧的Java代码,该代码是多年前由C程序员实现的,我们忍不住开始讨论该代码 - 即使它编译并工作 - 实际上是有效的Java代码。
final Object o = Boolean.TRUE;
boolean b = (boolean) o;
这本质上是有问题的代码。正如你所看到的,从Object到原始布尔值有一个不太好的投射,这应该是不可能的,但碰巧有效,这要归功于一些隐含的拳击魔术。
如果我执行以下操作
final Object o = Boolean.TRUE;
if (o instanceof Boolean) {
b = (boolean) o;
}
我甚至在o被投射到b的行上得到一个警告,说“Cast与给定的实例不兼容”。这显然是正确的,但由于隐含的拳击,它仍然有效。
现在的问题是:Java规范是否真的允许这种强制转换,因此应该与未来的JVM版本一起使用?还是它只是碰巧在当前版本中工作,并且在将来的JVM更新中可能不再工作?