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

final Object o = Boolean.TRUE;
boolean b = (boolean) o;

这本质上是有问题的代码。如您所见,从Object到原始boolean的转换不是那么好,这是不可能的,但是由于一些隐式的拳击魔术,它碰巧可以正常工作。

如果我执行以下操作
final Object o = Boolean.TRUE;
if (o instanceof Boolean) {
  b = (boolean) o;
}

我什至在将o强制转换为b的行上收到警告,说“Cast与给定的instanceof不兼容”。这显然是正确的,但由于隐式拳击而仍然有效。

现在的问题是:Java规范实际上允许该类型转换,因此应该与将来的JVM版本一起使用吗?还是只是在当前版本中起作用而在以后的JVM更新中可能不再起作用?

最佳答案

这在JLS 8, section 5.5中定义。它特别允许通过取消装箱转换从Object转换为原始类型进行转换(另请参见表5.5-A)。 JLS特别指出:



有关更多详细信息,请参见我对类似问题的回答:Differences in auto-unboxing between Java 6 vs Java 7

07-24 09:39
查看更多