为什么入门书中定义的有关类型转换和算术运算符的规则似乎冲突?

1 java operators typecasting-operator

我最近开始通过一本针对编程初学者的书来学习Java。关于类型转换和算术运算符的两个规则似乎在逻辑上冲突,我只是不知道问题出在哪里。

规则编号 本书定义的1:如果为int赋值的变量为byte,short或char类型,则将自动转换为int值;例如short s = 1234; 没有问题的作品。

规则编号 按照书中的定义2:如果使用算术运算符,则编译器首先检查一个操作数是否为double类型,如果是这种情况,则另一个操作数将自动类型转换为double。对于float,重复相同的操作,然后是long,最后是int。

我的问题在于像这样的情况

short a = 1; 
short b = 2; 
short c = a+b;  
Run Code Online (Sandbox Code Playgroud)

我只是不明白为什么我需要显式类型转换,即short c = (short) (a+b);; 该代码才能正常工作。上面的所有代码按照规则2生成的整数值应为3,然后根据规则1将其自动类型转换为short。

对于有关的,初学者友好的阅读材料的任何帮助或至少暗示,将非常感谢。

And*_*ner 5

这是因为ab不是编译时间常数。

这称为隐式缩小,仅当编译器可以确定分配给该变量的值适合该变量类型的范围时,才允许这样做。

尝试使变量恒定:

final short a = 1;
final short b = 2;
short c = a+b;  // Will now work.
Run Code Online (Sandbox Code Playgroud)

您可能想知道为什么编译器不知道这些是常量:这就是语言的定义方式。对于要被视为编译时常量的变量,它(在其他要求中)必须是明确最终的。