为什么 Java 在计算“result1”的数据类型时无法找出“result2”的数据类型而不对其进行类型转换?[复制]

why does java cant figure out data type of "result2" without type casting it as it figure out datatype of "result1"? [duplicate]

提问人:Vishal Sangole 提问时间:7/5/2023 更新时间:7/5/2023 访问量:29

问:

    int result1 = 10;
    result1 -= 5.5;// due to compound assignment this will not cause error and result will be 4
    System.out.println(result1);

    int result2 = 10;
    result2 = (int) (result - 5.5);// this will cause error if we domt use cascting
    System.out.println(result);

上述代码中使用的复合赋值运算符 (“ -= ”) 的动态数据类型转换背后的确切逻辑是什么。以及为什么在简单表达式的情况下不能应用相同的逻辑。

Java 类型 转换 运算符关键字

评论


答:

1赞 marcinj 7/5/2023 #1

在 Java 复合赋值运算符:+=、-=、*= 等中,对运算符左侧的变量类型执行隐式强制转换。

这在以下方面有所说明:

https://docs.oracle.com/javase/specs/jls/se20/html/jls-15.html#jls-15.26.2

形式为 E1 op= E2 的复合赋值表达式等价于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,只是 E1 只计算一次。

所以:

result1 -= 5.5

其实是:

result1 = (int)(result1 - 5.5)

倘:

result2 = (result2 - 5.5);

没有隐式强制转换,因此必须使用(int)

关于你的问题:

为什么在简单表达式的情况下不能应用相同的逻辑。

我想在复合赋值的情况下,语言设计者认为这样的表达式很清楚,你要更新原始变量,这种隐式转换将使代码更加简洁。但是在简单表达式的情况下,这种隐式强制转换可能会导致数据丢失 - 程序员必须在这里显式。