为什么 Java 不允许强制转换布尔值 -> Int?

2022-09-03 09:53:02

我想知道为什么Java不允许从布尔值转换为int,就像这样:

boolean foo = true;
int bar = (int)foo;

这可以在一行代码中完成,例如,

bar = foo ? 1 : 0;

但似乎一种更好,更易于阅读的方法是允许类型转换,就像和一样。为什么Java不包括这个功能?doubleint


答案 1

它不允许这样做,因为Java设计人员(正确地)认识到C和C++中的布尔值/整数重载是错误的重要来源。

(我记得在一些设计原理中看到了这一点,但我找不到它。

例如:

if (i = 0) {
    ...
}

是合法的,但可能是编写为C或C++的应用程序中的错误。

Java 通过使整数数据类型和整数数据类型与无法从一种数据类型转换为另一种类型来避免此问题和其他问题。因此,以上是Java中的编译错误。boolean

这并非在所有情况下都有效。例如(在Java中):

if (flag = true) {
    ...
}

编译。但是,它确实在足够多的情况下起作用,值得。此外,在Java中编写上述内容的惯用方法是:

if (flag) {
    ...
}

这完全避免了陷阱。此外,检查器喜欢或应该将不正确的版本标记为可疑。(风格检查器应该指出这是糟糕的风格!findbugspmdflag == true


现在,这并不能解释为什么不能将 a 显式键入到 .但我认为这可以通过观察以下内容来理解:booleanint

  • 在真正的Java程序中,你很少需要这样做。

  • 数字 <-> 布尔强制转换不会与其他类型的强制转换的工作方式相同。特别是,对于其他类型的,有上加强制转换和下放,Java中的上半转换1不需要显式类型转换。

  • 也不能在数字和字符串之间或字符串与其他对象之间进行类型转换。这些是转换,而不是类型转换。<>也是如此。intboolean


1 - 我在这里(故意)对我的术语很草率。正确的Java术语是“加宽”和“缩小”。缩小转换范围需要显式类型转换,但文本有有限的例外。扩大转化不需要类型转换。


答案 2

Java 支持在基元数值类型上加宽转换。但是,布尔值不被视为数值类型。

支持的加宽转换列在 Java 语言规范中的“加宽基元转换”下。