[英]Java Downcasting Conversion
为什么 char c = 65 有效而不抛出错误但 float d = 65.0 无效并抛出静态错误:分配中的错误类型:从双精度型到浮型? 两个人不都垂头丧气吗?
我可以从引用一句JLS 5.2节,并说“这是这样的,因为语言规范是这么说的”,但不会满足不是吗?
我对为什么设计这样的语言的有根据的猜测:
将65
转换为char
,您真正要做的只是在二进制表示中去掉一堆无关紧要的 0,因为char
是 16 位,而int
是 32 位。 这就像将 0065 变成 65。
另一方面, 65.0
是一个double
65.0
值并且以浮点格式表示。 请注意,通常,这种表示只是真实值的近似值。 有关更多信息,请参阅此帖子。 位数越多,近似效果越好。 因此,从double
(64 位)转换为float
(32 位)有点像将 0.333333 转换为 0.333。 希望您同意,这比将 0065 转换为 65 损失的信息更大。因此,这不是应该自动执行的转换。 程序员需要意识到这种情况正在发生。
无论如何,为了完整起见,这是语言规范的相关部分:
赋值上下文允许使用以下之一:
...
此外,如果表达式是
byte
、short
、char
或int
类型的常量表达式(第 15.28 节):
- 如果变量的类型是 byte、short 或 char,并且常量表达式的值可以在变量的类型中表示,则可以使用缩小原语转换。
因此,语言规范对 byte、short、char 和 int 进行了特殊处理,允许它们在赋值上下文中进行缩小转换。 请注意,表达式必须是:
char x = 100000;
是无效的。float d = 65.0;
65.0 不是浮点值。 这是一个双重价值。 输入浮点值时,数字必须以字母 f 结尾。
你看这里。
float d = 65.0f;
如果你想给 d 给 65 而不必写字母 f,你可以执行以下操作。
float d = (float)65.0;
这被称为窄铸造。
Java 意义上的65.0
是双倍的,因为.
. 如果你希望这个数字是一个浮点数,只需在它后面添加f
。
float d = 65.0f
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.