如果 boolean 在 JVM 中表示为 int,它如何对应 Java 是强类型的?

If boolean is represented as int in the JVM, how does it correspond with Java being strongly-typed?

我读到 JVM 将布尔值表示为 4 字节 (int)。 我的问题是 - Java 是强类型的 - 不允许转换为 int。 据我了解,JVM 习惯于 运行 根据 Java 的规范 (?) 编写代码,因此如果将用 C++ 编写的 3 + true 编译为字节码,它是合法的。

我错过了什么?

您对“JVM 习惯于 运行 根据 Java 规范进行编码”的理解是错误的。

有两种不同的规格

  1. The Java® Language Specification 描述了 Java 编程语言的语义和行为。它通常用于在 JVM 中创建 运行 的软件,但这不是严格的要求。
  2. The Java® Virtual Machine Specification 描述了 Java 虚拟机,一种特定的执行环境,它被设计为方便地作为使用 Java 编程语言编写的软件的目标平台,但是不限于此用途。

这在 JVM Spec §1.2:

中得到了澄清

The Java Virtual Machine knows nothing of the Java programming language, only of a particular binary format, the class file format. A class file contains Java Virtual Machine instructions (or bytecodes) and a symbol table, as well as other ancillary information.

因此,在编译以 Java 虚拟机作为执行环境的 Java 编程语言的源代码时,Java 编译器必须适应任意差异。


也就是说,“JVM 将布尔值表示为 4 字节 (int)”的说法是错误的。您被以下事实误导了,即在某些地方,不同类型的项目由相同的指令处理。特别是对于 局部变量 booleanint 值由相同的指令处理,但是,这同样适用于 byteshort,和char,所有五种类型都使用相同的字节码指令进行同等处理。

实际上,longdouble 类型由其他指令处理,这是在设计第一个 JVM 时为了简化实现而做出的历史性妥协。可以在任何地方推断每个变量和堆栈条目的类型,因此它也可以使用没有任何编码类型信息的通用指令集。

虽然这些处理局部变量和操作数栈的指令不区分booleanbyteshortcharint ,JVM 在涉及方法和字段签名时区分所有这些类型。在那里,boolean 专用类型。相反,当涉及到数组时,boolean 数组和 byte 数组使用相同的指令处理,这与处理 int 数组的指令不同。不过,boolean[]byte[] 数组本身具有不同的类型。

这些类型值的实际存储是否不同,完全取决于特定的 JVM 实现。