正如JVMS8
中
所说:
Java虚拟机虽然定义了boolean类型,但它只提供了 对它的支持非常有限。不存在单独的 Java 虚拟机指令 致力于布尔值的运算。相反,Java 中的表达式 对布尔值进行操作的编程语言被编译为使用值 Java 虚拟机 int 数据类型。确实,这两种方法:
boolean expr1(boolean a, boolean b) {
return a || b;
}
int expr2(int a, int b) {
return ((a != 0) || (b != 0)) ? 1 : 0;
}
将产生相同的字节码(方法签名除外)
boolean expr1(boolean, boolean);
Signature: (ZZ)Z
Code:
0: iload_1
1: ifne 8
4: iload_2
5: ifeq 12
8: iconst_1
9: goto 13
12: iconst_0
13: ireturn
int expr2(int, int);
Signature: (II)I
Code:
0: iload_1
1: ifne 8
4: iload_2
5: ifeq 12
8: iconst_1
9: goto 13
12: iconst_0
13: ireturn
所以,我不明白为什么JVM
需要
boolean
类型。仅仅是为了方法签名的运行时检查吗?
boolean a(boolean x) {...}
boolean a(int x) {...}
从高层次来看,像 Java 这样的语言区分整数和布尔类型(例如方法重载)绝对有优势。但从检查方法说明来看,你不会看到任何优势。
我的猜测是,JVM 布尔操作数类型仅适用于已编译的方法签名。即使像 baload 和 bastore 这样的指令的实现也会从操作数堆栈中弹出 32 位整数并截断为 8 位。