当前位置: 首页 > 面试题库 >

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

阴靖
2023-03-14
问题内容

我想知道为什么Java不允许将布尔值转换为整数,如下所示:

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

例如,这可以用一行代码来完成,

bar = foo ? 1 : 0;

但似乎更好和更容易阅读的方法是允许类型转换,如double和一样int。Java为什么不包括此功能


问题答案:

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

(我记得曾经写过一些设计原理的书,但我找不到。)

例如:

if (i = 0) {
    ...
}

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

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

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

if (flag = true) {
    ...
}

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

if (flag) {
    ...
}

完全避免了陷阱。另外,检查者喜欢findbugspmd应该将不正确的版本标记为可疑。

现在,这并不能解释为什么你不能明确地 类型转换 一个booleanint。但是我认为可以通过观察以下内容来理解:

  • 在真正的Java程序中,您 几乎 不需要这样做。

  • 数字<->布尔类型转换不会与其他类型类型转换的工作方式产生冲突。特别是,对于其他类型,有向上转换和向下转换,而Java中的向上转换1不需要显式的类型转换。

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

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



 类似资料:
  • 问题内容: 我将从3个简单的示例开始: 所有这些都是预期的。这是一个更复杂的示例。 也符合预期。但是,如果我 每个@unutbu的答案 熊猫正尝试将其重铸为原始dtype。我以为,也许我演奏过的组并没有真正地进行分组。所以我尝试了这个例子来测试这个想法。 我会和。如果@unutbu是正确的,则这些和应该是和,并且可以强制转换为,因此我们应该看到 果然… 但是,如果过程相同但值略有不同。 学过的知识

  • 问题内容: 存储在其中的值为“ 2015-08-24”,表示数据没有问题。 当我执行上面的语句时,我得到 将日期数据类型转换为日期时间数据类型导致超出范围的值 我可以知道为什么不能向它投专栏吗? 问题答案: 问题的 根本原因 是: 数据类型具有从到的一系列可接受的值 数据类型具有从到的一系列可接受的值 因此,如果您碰巧有一个1753之前的值或一个空/ NULL值-这将超出可以处理的范围。 您应该

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案

  • 我将值放入hashmap中, 我想通过使用map的方法创建一个列表。 但它允许我将其传递给列表的创建:

  • 下面的泛型代码无法编译,我可以理解原因:这是为了阻止可能不兼容的类型添加到集合中: 然而,我可以对数组做同样的事情,并且不会得到编译器错误。当我运行它时,我会得到一个 为什么编译器不阻止我上传数组,因为它会麻烦地阻止我上传泛型?

  • 问题内容: 在Java中将a转换boolean为an 的最常用方法是什么int? 问题答案: ^^ PS : true = 1 and false = 0