Trim(result)
在这种情况下,我需要将byte a=10;
byte b=20;
b=a+b;
显式转换为这样的字节:
a+b
与short相同:
b=(byte)(a+b);
否则会给出错误。
但是对于整数,不需要显式转换:
short x=23;
short y=24;
这可以正常工作。
那是为什么?
即使在很长的情况下,我们也不需要显式投射。
答案 0 :(得分:7)
如果您查看JLS 4.2.2 Integer Operations,它指出两个整数操作数之间的数字运算结果是int
或long
。由于没有从int
到byte
或short
的隐式转换,因此需要显式转换。
答案 1 :(得分:3)
如果您引用的是JLS Sec 15.18.2,它涉及数字类型的添加,它说:
对操作数(第5.6.2节)执行二进制数值提升。
...
数字操作数上加法表达式的类型是其操作数的提升类型。
JLS Sec 5.6.2描述了二进制数值提升:
如果任何操作数是引用类型,则将其进行拆箱转换(第5.1.8节)。
通行基元转换(第5.1.2节)适用于转换以下规则指定的一个或两个操作数:
如果其中一个操作数的类型为double,则另一个将转换为double。
否则,如果其中一个操作数的类型为float,则另一个将转换为float。
否则,如果其中一个操作数的类型为long,则另一个将转换为long。
否则,两个操作数都将转换为int类型。
因此,在int
和long
(两个操作数均为该类型)的情况下,二进制数值提升是不可操作的:操作数仍为int
和{{ 1}},并且相加的结果分别为long
和int
,这意味着可以将结果分配给该类型的变量。
在long
和byte
的情况下,二进制数值提升导致将两者都扩展为short
来执行加法,加法的结果为{{1 }};您必须再次明确地返回较窄的类型,因为并非所有int
值都适合int
或int
。
此要求有两个例外,以进行显式缩小强制转换。
首先,复合作业:这本来可以工作:
byte
因为,如JLS Sec 15.26.2中所述:
格式为
short
的复合赋值表达式与b += a;
等效,其中E1 op= E2
是E1 = (T) ((E1) op (E2))
的类型,除了T
仅被求值一次。
换句话说:编译器为您插入演员表:
E1
第二,如果操作数具有常量值,并且已知加法结果适合较窄类型的范围,和则在变量声明中进行赋值。
>例如:
E1
这不需要强制转换。
答案 2 :(得分:2)
随着Java的增加,java会将较小的数据类型提升为较大的数据类型。当数据类型小于int时,它将同时将操作数提升为int。看看:Promotion in Java?