本问题已经有最佳答案,请猛点这里访问。
我有三个简短的变量。
当我将两个加在一起并将结果分配给第三个时,eclipse告诉我需要将其转换为short!
short sFirst, sSecond, sThird;
sFirst = 10;
sSecond = 20;
sThird = sFirst + sSecond;
但是,当我先进行简单分配,然后进行增量分配时,一切都很好。
short sFirst, sSecond, sThird;
sFirst = 10;
sSecond = 20;
sThird = sFirst;
sThird += sSecond;
为什么是这样 ?
JLS(第15.8.2节)说:
"The binary + operator performs addition when applied to two operands of numeric type, producing the sum of the operands."
"Binary numeric promotion is performed on the operands (§5.6.2)."
这意味着表达式的操作数将转换为int。 因此,加法会将int添加到int。
"The type of an additive expression on numeric operands is the promoted type of its operands."
您的情况是int。
我不会猜测为什么这样做。 但是,这绝非偶然。 如果查看JVM规范中定义的字节码指令集,将会看到int,long,float和double ...有算术指令,但较小的整数类型则没有。
谢谢斯蒂芬。 由于具有C / C ++背景(超过20年),这种限制似乎是一种异常,应该由编译器而不是程序员真正处理。
Java语言规范中精确指定了此行为。
为什么如此具体说明问题的答案仅仅是猜测,而不是真正的答案。 我在Oli Charlesworth的支持下进行的"有根据的猜测"是因为等效语义适用于C语言和其他类似语言。 C语言中的语义是这样的(再次是"有根据的猜测"),因为它们允许编译器生成最佳代码。
对"为什么"的一个非常合理的答案是"因为它呼应其他类似C语言的语义"。
@OliCharlesworth我猜这是因为它为编译器提供了最大的自由度,可以生成最佳代码(我当然不是javac)。
但是,在C或C ++中,您无需将两个短裤加成
@Simon您的意思是显式投射。 那只是一种语法技巧,而这正是Java所采取的"保护程序员免受自身攻击"的态度。