"x += y" is roughly the same as "x = (type)(x + y)" where "type" is one of byte, char, short, int, etc. This implicit cast is what causes "x += 1" to compile and "x = x + 1" to not compile - the result of any arithmetic operation is never byte, char or short.