我已经阅读了该站点上有关类型转换的大多数线程(请不要再链接到我或将其标记为重复),并希望对其中一些特定情况进行解释。
1)
char x='a';
char y = 'b';
在这种情况下,我们不允许这样做
char z = x + y; \\case 1a
但是我们可以做
char z='a'+'b'; \\ case 1b
我在该站点上阅读到,两个字符的加法会导致一个整数,这就是为什么我们不能做1a,但是如果这样做,为什么我们可以做1b。
2)
为什么允许
byte byteVar = 42;
文字42是一个整数,因此即使42在字节范围内,为什么我们也允许将其存储在一个字节中而不进行转换。如果能够做到这一点,为什么不能做到1a。
3)
以下返回true
System.out.println(6.0000000000000000000000000000000001 == 6.0);
RHS被视为字面量的两倍。我猜LHS也被当作字面量的两倍,但它绝对超出了两倍的精度。为什么不引发错误,以及如何比较这两件事。
我将不胜感激对此的任何指导。谢谢。
最佳答案
前两个由相同的情况处理-JLS section 5.2:
此外,如果该表达式是类型为byte,short
,char
或int
的常量表达式(第15.28节):
如果变量的类型为byte
,short
或char
,并且常量表达式的值可以表示为变量的类型,则可以使用变窄的原始转换。
第三个只是从源代码中的文字到double
的常规转换的情况:精确到double
精确到6.0000000000000000000000000000000001的是6.0。因此,如果您有:
double d = 6.0000000000000000000000000000000001;
将为
d
分配6.0的值,因为这是与源代码中指定的值最接近的double
可表示。