为什么boolean是唯一没有定义强制或强制转换的类型?

Ros*_*one 2 java language-design

不允许这似乎是合理的

int a = 8;
boolean b = (boolean)a;
Run Code Online (Sandbox Code Playgroud)

因为这可能导致程序员错误,因为即使整数产生的布尔值也是假的,但为什么不加宽,例如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;
}
Run Code Online (Sandbox Code Playgroud)

编译为:

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

public static boolean returnTrue();
  Code:
     0: iconst_1
     1: ireturn
Run Code Online (Sandbox Code Playgroud)

Dav*_*ton 8

内部表示无关紧要.

Java是强类型的:a int不是a boolean,a boolean不是a int.

这是一个设计决定 - 如果你想使用true/false,请使用布尔值; 沟通的东西.

如果你想用一个整数表示真/假,使用数学比较 - 这也没关系.

该语言不支持直接转换,因为它没有设计.


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

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

对我来说,这是:

如果编译器/ VM使用VM整数表示true/false,它必须使用1/0约定.其含义是:如果编译器/ VM 使用VM整数表示true/false,则不需要这样做.

关于这一点的澄清将是有趣的,但最终不相关,真的.

  • @RosePerrone不是*任意*数据类型; 整数和浮点数都是数字.布尔值*不表示数字*:它表示true或false,这就是全部. (3认同)