It is weird indeed. This is connected to the compiler I believe. If you change the first snippet of code to
final int i = 130; byte b = i; System.out.println(b);
the code generates the compilation error you would expect anyhow (because i>128). My assumption is this:
The compiler checks whether a loss of precision MAY take a place but i is final AND already asigned to 100 (in bit domain) therefore the compiler knows it can fit into a byte and this cannot change and I believe that for optimization purposes does not generate the error.
However if i>127 the error is generated as the conversion MUST take place and there is a big chance for the precision to be lost. However this trick is much too subtle.. I would have certainly overlooked it. You have a very good question .. I had to copy the code into Eclipse and test it to be shore that it doesn't throw a compilation error.
Better, faster, lighter Java ... you mean Ruby right ?
SCEA5,SCBCD1.3,SCWCD5,SCJP1.4 - memories from my youth.