【问题标题】:Is casting from Object to boolean valid Java language?是否从 Object 转换为布尔有效的 Java 语言?
【发布时间】:2016-11-23 17:43:48
【问题描述】:

我在工作期间偶然发现了一个旧的 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 is incompatible with given instanceof”。这显然是正确的,但由于隐式装箱,它仍然有效。

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

【问题讨论】:

标签: java language-specifications


【解决方案1】:

这是在JLS 8, section 5.5 中定义的。它特别允许从Object 到原始类型的拆箱转换(另见表5.5-A)。特别是 JLS 说:

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

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

【讨论】:

    【解决方案2】:

    是的。这是合法的。请参阅JLS-5.1.8. Unboxing Conversion,它说(部分)

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

    • 从布尔型到布尔型

    【讨论】:

    • 优秀的报价,谢谢。然而,有问题的转换源是 Object 类型,而不是 Boolean。
    • @TwoThe Object 是一个引用类型。在运行时,所有实例的类型也是Object
    猜你喜欢
    • 2013-07-30
    • 2016-07-17
    • 1970-01-01
    • 2017-01-14
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多