我已经阅读了本网站上关于类型转换的大部分主题(请不要再给我链接或将其标记为重复),并希望对其中一些特定情况进行解释。
1)
char x='a';
char y = 'b';
在这种情况下,我们是不允许做的
char z = x + y; \\case 1a
但我们可以做到
char z='a'+'b'; \\ case 1b
我在这个网站上读到,两个字符相加得到一个 int,这就是为什么我们不能做 1a,但如果可以,为什么我们可以做 1b。
2)
为什么允许这样做
byte byteVar = 42;
字面量 42 是一个 int,那么为什么我们允许将它存储在一个字节中而不强制转换,即使 42 在字节范围内。如果这可以做到,为什么 1a 不能做到。
3) 以下返回 true
System.out.println(6.0000000000000000000000000000000001 == 6.0);
RHS 被视为文字 double 值。我猜 LHS 也被视为字面上的 double ,但它肯定超过了 double 所允许的精度。为什么不抛出错误以及如何比较两者。
我将不胜感激任何关于这方面的指导。谢谢。
最佳答案
前两个由同一个案例处理 - JLS section 5.2 :
In addition, if the expression is a constant expression (§15.28) of type byte,
short
,char
, orint
:
- A narrowing primitive conversion may be used if the type of the variable is
byte
,short
, orchar
, and the value of the constant expression is representable in the type of the variable.
第三个只是从源代码中的文字到 double
的常规转换的情况:最接近 6.00000000000000000000000000000000001 的 double
是 6.0。所以如果你有:
double d = 6.0000000000000000000000000000000001;
这会将值 6.0 分配给 d
,因为它是最接近源代码中指定值的可表示 double
。
关于java - Java 中的原始类型转换(令人不安的示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45529335/