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

时间:2012-06-08 19:07:50

标签: java language-design

不允许

似乎是合理的
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

3 个答案:

答案 0 :(得分:8)

内部表示无关紧要。

Java是强类型的:int不是boolean,而boolean不是int

这是一个设计决定 - 如果你想使用true / false,请使用布尔值;传达某种东西。

如果你想使用一个整数来表示是/否,请使用数学比较 - 这也没关系。

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


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

  

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

对我而言:

  

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

关于这一点的澄清将是有趣的,但最终没有相关性,真的。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

我很困惑“为什么不扩大强制,例如int a = true work”你想知道为什么他们没有这样做所以这会将1分配给一个?