2

不允许似乎是合理的

int a = 8;
boolean b = (boolean)a;

因为这可能导致程序员错误,因为对于偶数整数,结果布尔值将是错误的,但为什么不扩大强制,例如int a = true工作?

编辑:

根据 JVM 规范,第 3.3.4 节:

Java 虚拟机使用 1 表示 true 和 0 表示 false 对布尔数组组件进行编码。在 Java 编程语言布尔值由编译器映射到 Java 虚拟机类型 int 的值时,编译器必须使用相同的编码。

例如:

public static boolean returnFalse() {
    return false;
}

public static boolean returnTrue() {
    return true;
}

编译为:

public static boolean returnFalse();
  Code:
     0: iconst_0
     1: ireturn

public static boolean returnTrue();
  Code:
     0: iconst_1
     1: ireturn
4

3 回答 3

8

内部表示不相关。

Java 是强类型的:anint不是 a boolean,并且 aboolean不是int.

这是一个设计决定——如果你想使用真/假,使用布尔值;沟通的东西。

如果您想使用整数来表示真/假,请使用数学比较——这也很好。

该语言不支持直接转换,因为它在设计上不支持。


关于 JVM 规范和布尔值的内部表示,这句话很有意思:

在 Java 编程语言布尔值由编译器映射到 Java 虚拟机类型 int 的值时,编译器必须使用相同的编码。

对我来说,上面写着:

如果编译器/VM 使用 VM 整数来表示真/假,那么它必须使用 1/0 约定。这意味着:如果编译器/VM没有使用 VM 整数来表示真/假,则这不是必需的。

澄清这一点会很有趣,但最终并不相关,真的。

于 2012-06-08T19:33:07.050 回答
0

Java 不是 C++ 来持有一个 0 代表假和 1 代表真。在 java 中,布尔值是一种不同的数据类型。C++ 需要至少 1 个字节才能有一个布尔值。在 java 中,它取决于 JVM 实现。

于 2012-06-08T19:11:27.727 回答
0

这只是一个约定,在 C++ 等语言中,0 为假,所有其他整数为真。Java 没有任何约定为任何整数指定布尔值。

我对“为什么不扩大强制,例如 int a = true 起作用”感到困惑,您想知道为什么他们没有做到,所以这会将 1 分配给 a?

于 2012-06-08T19:13:54.027 回答