For example:
int anInt = null;
fails at compile time but
public static void main(String[] args) {
for (int i = 0; i < 10;
In the first case, the compiler knows that you're trying to unbox a compile-time constant of null
.
In the second case, the type of the conditional expression is Integer
, so you're effectively writing:
Integer tmp = new Random().nextBoolean() ? 1 : null;
return (int) tmp;
... so the unboxing isn't happening on a constant expression, and the compiler will allow it.
If you changed it to force the conditional expression to be of type int
by unboxing there, it would fail:
// Compile-time failure
return new Random().nextBoolean() ? 1 : (int) null;