本问题已经有最佳答案,请猛点这里访问。

我只是无法理解这个区别:

short d = 0;
//some code
node.accessible = d + 1;

还有这个

short d = 0
//same code here
node.accessible = d;
node.accessible += 1;

第二件事是工作,但第一件事是不是inteliji显示"不兼容的类型"错误。

附: 节点类:

public class Node {
int n;
short accessible;
Node(int n){
this.n = n;
this.accessible = -1;
}
}

你的意思是键入+=而不是=+?

为什么你首先使用short? 在我的长Java载体中,我很少发现使用short而不是int或boolean进行全面测试的情况。 由于int的内部优化,甚至存在short慢于int的情况。 此外,与可能的微观性能改进相比,由于不希望的溢出(无例外)导致的错误的可能性通常太高。 当然,这取决于你的应用,这就是我问的原因。

@Zabuza谢谢,我会注意到这一点,但现在我只是好奇。

在第二个样本中,

node.accessible += 1;

实际上是

node.accessible = (short)(node.accessible + 1);

所以它没有问题。

但在第一个

node.accessible = d + 1;实际上是node.accessible = d + 1;并且它不会自动转换为短,因此会出现错误,因为(d + 1)的类型为int

这个问题已被更新,但只是fyi ... =+ 1工作的原因实际上是= +1 - 也就是说,你正在分配一个正数为1的int文字。但是因为那个文字也是 一个常量,并且编译器可以确认它适合短路,通过JLS 5.2,缩小转换(从int到short)成功。

我认为=+ 1是一个错字,实际上是+= 1并相应地写了我的答案。 但是谢谢你;)

那是因为+ 1表达式中的1类型为int。将short添加到int会导致int,如果没有缩小回放到node.accessible,则无法分配。

在第一个版本中:

node.accessible = d + 1;

d + 1产生int作为int的总和,而short产生int。

JLS确实说明了(看看最后一个案例,重点是我的):

5.6.2. Binary Numeric Promotion

When an operator applies binary numeric promotion to a pair of

operands, each of which must denote a value that is convertible to a

numeric type, the following rules apply, in order:

If any operand is of a reference type, it is subjected to unboxing

conversion (§5.1.8).

Widening primitive conversion (§5.1.2) is applied to convert either or both operands as specified by the following rules:

If either operand is of type double, the other is converted to double.

Otherwise, if either operand is of type float, the other is converted

to float.

Otherwise, if either operand is of type long, the other is converted

to long.

Otherwise, both operands are converted to type int.

但是,如果int具有比short更宽的范围,则无法将int分配给short字段short而不显式转换。

在第二个版本中,使用复合赋值运算符(+=):

node.accessible += 1;

因此,在您的情况下,操作的结果将转换为short:JLS声明的左侧变量的类型:

15.26.2. Compound Assignment Operators

A compound assignment expression of the form E1 op= E2 is equivalent

to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1

is Evaluations only once.

更具体地说,在你的情况下:

Otherwise, the result of the binary operation is converted to the type
of the left-hand variable, subjected to value set conversion (§5.1.13)
to the appropriate standard value set (not an extended-exponent value
set), and the result of the conversion is stored into the variable.

问题是为什么+=进行自动向下投射而d + 1没有进行自动向下投射。 JLS对此的引用会很好。

@Zabuza最后我无法删除它(已接受)。 我认为问题不仅仅是复合赋值问题或int + short问题的结果类型,而是两者都有。 所以解决这两个问题更有意义。