Same reason as in your other question; the declaration with assignment works because this is a special case. But the value that you are assigning must be a compile-time constant. The b + c expression in line 3 is not a compile-time constant.
And (byte)b + c doesn't work. The cast has a higher precendence than the + operator, which means that (byte)b + c is the same as ((byte)b) + c. So you cast b to byte (which is unnecessary because it is already a byte), then the + happens which returns an int. To make it work, you must cast the result of the + operator to byte by putting parentheses around the expression:
I guess that's a design decision of the Java developers. In the same line of thinking, you could ask yourself these questions:
- Why are literals from -128 to 127 int literals and not byte literals?
- Why are literals from -32768 to 32767 (excluding those from -128 to 127) int literals and not short literals?
- Why do long literals need an L? Any literal outside the range of int but inside the range of long could be long automatically.
In other words, the type of integer literals could have been dynamic, based on the range. The developers decided not to do this but use int as the default type, for both literals and mathematical expressions. That's something you'll now have to live with.