我已经编写了代码:

        int x = 18;
        x *= 0.90; 
        System.out.println(x);

此代码打印了16

然而,当我写下

        int x = 18;
        x = x * 0.90; 
        System.out.println(x);

它给出了以下错误:incompatible types: possible lossy conversion from double to int

我预计这两个代码示例都会导致完全相同的错误,因为x *= y;x = x * y;相同,但x *= 0.90;以某种方式工作,而x = x * 0.90;不能.为何会是这样呢?

推荐答案

因为Java语言规范(JLS)这么说.这有点奇怪,但是,当使用复合赋值操作符(*=+=等)时,类型转换是隐含的.

JLS §15.26.2,它清楚地显示了该部分右上角的示例中的演员.

为什么会这样?好吧,我不认为SO是一个合适的地方go 问"30年前当JLS规范的这一部分被写出来的时候,设计师们在想什么".

编辑:这个答案过go 常常提到"可能是因为C",但正如 comments 所示,不是,在C中,这两种形式都不需要显式强制转换.

Java相关问答推荐

Android -如何修复Java.time.zone. ZoneRulesExcept:未知时区ID:Europe/Kyiv

Java Stream,需要更新列表对象列表

Javascript在边界中心调整ImageView大小

使用java访问具体子类特定方法的最佳方法是什么?

关于泛型的覆盖规则

如何判断一个矩阵是否为有框矩阵?

具有多种令牌类型和段的复杂Java 17正则表达式

在Spring Boot应用程序中导致";MediaTypeNotSupportdException&qot;的映像上载

与Spring Boot相关的实体未正确保存

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

自定义批注的外推属性值

尽管通过中断请求线程死亡,但线程仍将继续存在

我的Spring Boot测试显示&IlLegalStateException:无法加载某事的ApplicationContext.

如何在代码中将行呈现在矩形前面?

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

如何处理两个几乎相同的XSD文件?

JavaFX标签中的奇怪字符

通过/失败的参数化junit测试方法执行数

双对象供应商

在JPanel上使用GridBagLayout并将JButton放在里面时出现问题