15

我想知道为什么 Java 不允许从 boolean 转换为 int,如下所示:

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

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

bar = foo ? 1 : 0;

但似乎更好且更易于阅读的方法是允许类型转换,如doubleand int。为什么 Java 不包含此功能?

4

3 回答 3

29

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

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

例如:

if (i = 0) {
    ...
}

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

Java 通过使boolean整数数据类型成为不能从一种转换到另一种的不同类型来避免这个问题和其他问题。因此,以上是Java中的编译错误。

这并不适用于所有情况。例如(在 Java 中):

if (flag = true) {
    ...
}

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

if (flag) {
    ...
}

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


现在这并不能解释为什么您不能显式地将 cast a类型boolean转换为int. 但我认为可以通过观察以下内容来理解:

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

  • Number <-> boolean 转换不会与其他类型转换的工作方式相结合。特别是,对于其他类型,有向上转换和向下转换,Java 中的向上转换1不需要显式类型转换。

  • 您也不能在数字和字符串之间进行类型转换,也不能在字符串和其他对象之间进行类型转换。这些是转换,而不是类型转换。int<->boolean也是。


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

于 2013-04-29T14:55:38.200 回答
3

Java 支持扩展原始数字类型的转换。但是,布尔值不被视为数字类型。

支持的扩展转换列在Java 语言规范中的“扩展原语转换”下。

于 2013-04-29T14:56:09.287 回答
2

Because Java is strongly typed, a boolean and an int are two completely different data typesand one can not be casted to the other - it can not be casted, in fact.

于 2013-04-29T14:54:01.460 回答