13

我在几年前由 C 程序员实现的工作中偶然发现了一个旧的 Java 代码,我们不禁开始讨论该代码 - 即使它可以编译和工作 - 是否实际上是有效的 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 is incompatible with given instanceof”。这显然是正确的,但由于隐式装箱,它仍然有效。

现在的问题是:Java 规范是否真的允许这种转换,因此应该适用于未来的 JVM 版本?或者它只是碰巧在当前版本中工作,而在未来的 JVM 更新中可能不再工作?

4

2 回答 2

8

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

拆箱转换将引用类型的表达式转换为原始类型的相应表达式。具体来说,以下八种转换称为拆箱转换

  • 从布尔类型到布尔类型
于 2016-11-23T17:45:53.653 回答
8

这在JLS 8 第 5.5 节中定义。它特别允许通过拆箱转换从Object原始类型进行强制转换(另请参见表 5.5-A)。具体来说,JLS 说:

引用类型的表达式可以通过取消装箱转换无错误地转换为原始类型。

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

于 2016-11-23T17:51:04.517 回答