java - Java 中的原始类型转换(令人不安的示例)

标签 java casting

我已经阅读了本网站上关于类型转换的大部分主题(请不要再给我链接或将其标记为重复),并希望对其中一些特定情况进行解释。

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, or int:

  • A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, 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/

相关文章:

java - 通过 Intent 拍摄照片

java - 可疑的 JVM 时间行为

java - 对++ 和双重 Actor 感到好奇

c# - 在 C# 中使用不强制转换的整数枚举

c++ 将 vector<Inherited*> 转换为 vector<abstract*>

java - Spring MVC Web 应用程序在打开新的浏览器 session 时重建两个 View

java - 寻找一种用Java制作简单数据库或列表的方法(比HashMap更高级,比JDBC更容易)

java - JPanel 组件放置

casting - 将 int 转换为枚举

iphone - 类型转换 UIView 警告