| A conditional expression with numeric second and third operands of differing | |
| types may give surprising results. | |
| For example: | |
| Object t = true ? Double.valueOf(0) : Integer.valueOf(0); | |
| System.out.println(t.getClass()); // class java.lang.Double | |
| Object f = false ? Double.valueOf(0) : Integer.valueOf(0); | |
| System.out.println(f.getClass()); // class java.lang.Double !! | |
| Despite the apparent intent to get a `Double` in one case, and an `Integer` in | |
| the other, the result is a `Double` in both cases. | |
| This is because the rules in | |
| [JLS ยง 15.25.2](https://docs.oracle.com/javase/specs/jls/se9/html/jls-15.html#jls-15.25.2) | |
| state that differing numeric types will undergo binary numeric promotion. As | |
| such, the latter case is evaluated as: | |
| Object f = | |
| Double.valueOf( | |
| false | |
| ? Double.valueOf(0).doubleValue() | |
| : (double) Integer.valueOf(0).intValue()); | |
| To get a different type in the two cases, one can either explicitly cast the | |
| operands to a non-boxable type: | |
| Object f = false ? ((Object) Double.valueOf(0)) : ((Object) Integer.valueOf(0)); | |
| System.out.println(t.getClass()); // class java.lang.Integer | |
| Or use if/else: | |
| Object f; | |
| if (false) { | |
| f = Double.valueOf(0); | |
| } else { | |
| f = Integer.valueOf(0); | |
| } |