首页 > 解决方案 > Java中的类型提升

问题描述

我对以下 Java 语句有疑问:

byte b = 10;
byte r = (byte) (b * b); // Giving correct result
byte r = (byte) b * b; // Giving error " POSSIBLE LOSS OF PRECISION"

为什么必须给括号加括号b * b

标签: java

解决方案


(byte) b * b将 first 的值转换bbyte这是多余的,因为它已经是byte),并将其乘以 second 的值bbyte将两个s相乘会将它们提升为int第一个,因为 s 没有*运算符byte。因此结果是int,并且不能分配给byte变量。

另一方面,(byte)(b * b)int乘法结果转换为byte,可以将其分配给byte变量。

这在5.6.2 的 JLS 中有介绍。二进制数字提升

当运算符将二进制数值提升应用于一对操作数时,每个操作数都必须表示一个可转换为数值类型的值,以下规则按顺序适用:

  1. 如果任何操作数属于引用类型,则将对其进行拆箱转换(第 5.1.8 节)。

  2. 加宽原语转换(第 5.1.2 节)适用于转换以下规则指定的一个或两个操作数:

    • 如果任一操作数是 double 类型,则另一个操作数将转换为 double。

    • 否则,如果任一操作数的类型为浮点型,则另一个将转换为浮点型。

    • 否则,如果任一操作数是 long 类型,则另一个将转换为 long。

    • 否则,两个操作数都转换为 int 类型


推荐阅读