Reputation: 2124
There is the following code:
Integer time = 12;
Double lateTime = 12.30;
Boolean late = false;
Double result = late ? lateTime : time; //Why here can I assign an Integer to a Double?
System.out.println(result);
It prints:
12.0
This one doesn't compile. Why?
Integer time = 12;
Double lateTime = 12.30;
Double result = time; //Integer cannot be converted to Double
System.out.println(result);
Upvotes: 10
Views: 327
Reputation: 234715
The differences are due to the ternary operator behaviour in Java.
The ternary conditional case:
In the expression late ? lateTime : time
, Java will auto-unbox exactly one of the arguments (according to the value of late
) to its respective primitive type. (You can observe this by setting time
to null
and late
to true
: a NullPointerException
is not thrown. The same applies when setting lastTime
to null
and late
to false
.)
If the value of the expression will be time
, then this is widened to a double
.
In either case, the resulting double
is auto-boxed to a Double
in assigning it to result
.
The simple assignment case:
In writing Double result = time;
, Java disallows this as it expects you to be more explicit.
Personally I find the mechanism of the Java ternary conditional operator with respect to the boxed primitive types to be one of the most pernicious parts of the language.
Upvotes: 12