The following line of code is accepted by the compiler (sun-jdk-8u51) without any warnings or errors:
short b = true ? 1 : 1;
Whereas the next two code lines lead to a compilation error (incompatible types: possible lossy conversion from int to short):
boolean bool = true;
short s = bool ? 1 : 1;
Why is the compiler not able to perform the same narrowing conversion of the primitive integer 1 in the second case?
As outlined by @aioobe in the comments:
This is because in the first case, since
true
is a compile time constant, the whole expression is evaluated during compile time, so you basically haveshort b = 1;
whereas in the second version, the compiler does not do the simplification for you, hence the error
Adding final
to the declaration of the variable bool
makes it a constant variable, which also allows the compiler to interpret the code as mentioned above.
final boolean bool = true;
short s = bool ? 1 : 1;
See section 4.12.4
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With