16

Possible Duplicate:
Tricky ternary operator in Java - autoboxing

We know that int roomCode = null; is not allowed by the compiler.

Then why the Code 1 doesn't give a compiler error, when Code 2 does.

Code 1:

int roomCode = (childCount == 0) ? 100 : null;

Code 2:

int roomCode = 0;
if(childCount == 0) roomCode = 100;
else roomCode = null; // Type mismatch: cannot convert from null to int
Community
  • 1
  • 1
ironwood
  • 8,936
  • 15
  • 65
  • 114
  • 1
    maybe related to autoboxing but I don't see how... – talnicolas Feb 23 '12 at 05:56
  • What does the `null` evaluate to when it takes that path? – Mysticial Feb 23 '12 at 05:58
  • From the [JLS 15.25](http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.25): `If one of the second and third operands is of the null type and the type of the other is a reference type, then the type of the conditional expression is that reference type.` So in your case it might consider return type of `?:` operator as int. – Harry Joy Feb 23 '12 at 05:58
  • Before I post, I searched but couldn't find a duplicate. Thanx for the reference Joel. +1. – ironwood Feb 23 '12 at 06:14

1 Answers1

11

I did a little debugging and found out that when evaluating

(childCount == 0) ? 100 : null;

the program calls the method valueOf of Integer to evaluate the null. It returns an Integer and as an Integer can be null (and not an int), it compiles. As if you were doing something like:

int roomCode = new Integer(null);

So it is related to autoboxing.

talnicolas
  • 13,885
  • 7
  • 36
  • 56