§5.1.2 and §5.6.2 do not mention how numeric promotion and widening work for constants.
The following gives an error as expected:
short a = 2;
short b = 3;
short s = a + b; // error: incompatible types: possible lossy conversion from int to short
But if they are declared final, it compiles without error:
final short a = 2;
final short b = 3;
short s = a + b; // no error
Why is that? And which section of the specs explains that?
My guess is that they are compile time constants and therefore treated as integers.