从Object转换为布尔有效的Java语言?

Two*_*The 12 java language-specifications

我在多年前由C程序员实现的工作中偶然发现了一个旧的Java代码,我们不禁开始讨论代码 - 即使它编译和工作 - 实际上是有效的Java代码.

final Object o = Boolean.TRUE;
boolean b = (boolean) o;
Run Code Online (Sandbox Code Playgroud)

这基本上是有问题的代码.正如你所看到的,从对象到原始布尔值有一个不太好的演员,这应该是不可能的,但是由于一些隐含的拳击魔术而恰好起作用.

如果我做以下事情

final Object o = Boolean.TRUE;
if (o instanceof Boolean) {
  b = (boolean) o;
}
Run Code Online (Sandbox Code Playgroud)

我甚至在o被投射到b的行上发出警告,说"Cast与给定的instanceof不兼容".这显然是正确的,但由于隐式拳击仍然有效.

现在问题是:Java规范实际上是否允许转换,因此应该适用于未来的JVM版本?或者它恰好在当前版本中工作,可能不再适用于未来的JVM更新?

Ell*_*sch 8

是.这是合法的.见JLS-5.1.8.拆箱转换说(部分)

拆箱转换将引用类型的表达式转换为基本类型的相应表达式.具体而言,以下八次转化称为拆箱转化:

  • 从类型Boolean到类型boolean

  • 优秀的报价,谢谢.但是,有问题的演员源是Object类型而不是Boolean类型. (2认同)
  • @TwoThe`Object`是一个引用类型.在运行时,所有实例也都是"Object"类型. (2认同)

Mar*_*eel 8

这在JLS 8的第5.5节中定义.它特别允许使用拆箱转换进行转换Object为基本类型(另请参见表5.5-A).特别是JLS说:

通过拆箱转换,可以将引用类型的表达式转换为基本类型而没有错误.

有关更多详细信息,请参阅我对类似问题的回答:Java 6与Java 7之间的自动拆箱差异