In both the above cases, the int value is implicitly downcasted to short. The literal 10 is an int literal, which is implicitly downcasted to short in line 1. On line 3, the final constant i is implicitly downcasted to short...
As you said yourself, since i was a compile time constant, so it was automatically downcasted to short. Compile time constants are either of primitive types or String, other types of final variables are not compile time constants (including wrappers). This is why implicit downcast doesn't work on wrapper objects...
Since interface accepts only constants, We can add wrapper objects as well. So there should be a difference between compile time constants and just constants? If so, how the just constants work? (At runtime???).