【问题标题】:Why is boolean the only type for which there are no coercions or casts defined?为什么 boolean 是唯一没有定义强制或强制转换的类型?
【发布时间】:2012-06-12 20:37:04
【问题描述】:

不允许这样做似乎是合理的

int a = 8;
boolean b = (boolean)a;

因为这可能导致程序员错误,因为结果布尔值对于偶数整数来说是错误的,但是为什么不扩大强制,例如int a = true工作?

编辑:

根据 JVM 规范,第 3.3.4 节:

Java 虚拟机使用 1 对布尔数组组件进行编码到 代表真,0代表假。 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

【问题讨论】:

  • a 的值是多少?为什么? 1 比 23、-567 还是 0 更真实?
  • 因为 int 不是布尔值。我不太明白“奇数”的意思。
  • 显然 42 比 -567 更真实。
  • @DaveNewton,您应该将其发布为答案。
  • @LouisWasserman 在我完成输入后我意识到它似乎比评论更回答:/

标签: java language-design


【解决方案1】:

内部表示不相关。

Java 是强类型的:int 不是booleanboolean 不是int

这是一个设计决定——如果您想使用真/假,请使用布尔值;沟通的东西。

如果您想使用整数来表示真/假,请使用数学比较——也可以。

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


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

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

对我来说是这样的:

如果编译器/VM 使用 VM 整数来表示真/假,那么它必须使用 1/0 约定。 含义是:如果编译器/VM使用 VM 整数表示真/假,这不是必需的。

澄清这一点会很有趣,但最终并不相关,真的。

【讨论】:

  • 我猜你应该在“一个 int 不是布尔”部分添加一个反之亦然:)。
  • 为什么float f = 3 合法?对于其他数据类型,扩大强制转换是否合法?
  • @RosePerrone 不是任意数据类型;整数和浮点数都是数字。布尔值不代表数字:它代表真或假,仅此而已。
  • @RosePerrone 一个整数值是一个实数:)。
【解决方案2】:

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

【讨论】:

  • (即)说真假1位就够了,不需要1字节。
【解决方案3】:

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

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

【讨论】:

  • 正确。 JVM 规范表明内部表示是单个位,所以我假设布尔值的整数表示是 0 或 1。
  • 哦,我明白了,你说得有道理。仅仅因为这就是它实际工作的方式(就像它在虚拟机中的存储方式一样),他们做到了,所以你不能用源代码做到这一点。
  • 归结为他们让编译器不允许这样做。
猜你喜欢
  • 2011-12-28
  • 2020-08-29
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 2018-03-15
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多