15

A colleague of mine asked this question to me and I am kind of confused.

int i = 123456;
short x = 12;

The statement

x += i;

Compiles fine however

x = x + i;

doesn't

What is Java doing here?

Raedwald
  • 43,666
  • 36
  • 142
  • 227
Em Ae
  • 7,519
  • 22
  • 73
  • 143

3 Answers3

20
int i = 123456;
short x = 12;
x += i;

is actually

int i = 123456;
short x = 12;
x = (short)(x + i);

Whereas x = x + i is simply x = x + i. It does not automatically cast as a short and hence causes the error (x + i is of type int).


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 evaluated only once.

- JLS §15.26.2

Community
  • 1
  • 1
arshajii
  • 123,543
  • 24
  • 232
  • 276
3

The + operator of integral types (int, short, char and byte) always returns an int as result.

You can see that with this code:

//char x = 0;
//short x = 0;
//byte x = 0;
int x = 0;
x = x + x;

It won't compile unless x is an int.

Gilberto Torrezan
  • 4,845
  • 3
  • 33
  • 49
2

Numbers are treated as int unless you specifically cast them otherwise. So in the second statement when you use a literal number instead of a variable, it doesn't automatically cast it to the appropriate type.

x = x + (short)1;

...should work.

jefflunt
  • 32,873
  • 7
  • 86
  • 126
asteri
  • 11,192
  • 12
  • 57
  • 82
  • I wrote wrong equation. I updated my question. See its `x = x + i`. – Em Ae Sep 21 '12 at 20:32
  • Ok, then why doesn't x = x + x; work? The problem isn`t on the number 1 but on the + operator that returns an int. – lleite Sep 21 '12 at 20:34