java - 从 Object 转换为 boolean 有效的 Java 语言吗?

标签 java language-specifications

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

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

这实际上是有问题的代码。如您所见,从对象到原始 boolean 值的转换不太好,这不应该是可能的,但由于一些隐含的装箱魔法,它恰好起作用了。

如果我执行以下操作

final Object o = Boolean.TRUE;
if (o instanceof Boolean) {
  b = (boolean) o;
}

我什至在将 o 转换为 b 的那一行收到一条警告,说“Cast is incompatible with given instanceof”。这显然是正确的,但由于隐式装箱仍然有效。

现在的问题是:Java 规范是否真的允许强制转换,因此应该适用于 future 的 JVM 版本?还是它恰好适用于当前版本,可能在未来的 JVM 更新中不再适用?

最佳答案

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

An expression of a reference type may undergo casting conversion to a primitive type without error, by unboxing conversion.

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

关于java - 从 Object 转换为 boolean 有效的 Java 语言吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40771073/

相关文章:

java - addAll 方法的 jUnit 测试

go - golang 规范中的可分配性问题

c - 哪种机制知道程序的入口点是main()

javascript - 为什么 for...in 循环中的变量是字符串?

java - Apache HttpClient,基于表单的登录,不检索 HTML 内容

java - 绘制和重绘以及 JFrame/JPanel 创建

java - ResourcePool 无法从其主要工厂或来源获取资源

java - <输入类型="date">格式

java - 这里指的是什么变量?

c# - 在哪里可以找到 C# 语言规范 6.0?