Recientemente nos encontramos con un error en la producción que me pareció muy interesante. Mi comprensión desde hace mucho tiempo es que un booleano de Java solo puede ser falso o verdadero. Sin embargo, parece que en un Operador Ternario puede resolverse en última instancia como nulo, y nunca produjo un error de compilación, y se construyó todo el camino hasta la producción. Estoy muy sorprendido de que el siguiente código no genere un error de compilación. ¿Alguien sabe por qué compila bien? En mi humilde opinión, no debería compilar! El valor al que finalmente se resuelve es un valor booleano nativo.
boolean por = (str == null || str.length() == 0) ? null : "true".equalsIgnoreCase(str);¿Alguien sabe por qué compila bien?
En última instancia, debido al autoboxing / autounboxing.
Cuando el compilador procesa una expresión ternaria, utiliza el segundo y tercer operandos para elegir el tipo de resultado de la expresión. En su caso, el segundo tiene un tipo nulo y el tercero tiene un tipo boolean (primitivo). Estos no son directamente compatibles, pero debido al autoboxing, ambos son compatibles con el tipo Boolean . Por lo tanto, el resultado de la expresión es de tipo Boolean , que admite null .
Debido al desbloqueo automático, se permite asignar un valor de tipo Boolean a una variable de tipo boolean , pero esto fallará con una NullPointerException en el caso de que el valor asignado sea nulo, como si hubiera invocado el booleanValue() método en él. Supongo que este es el error que observaste en producción.
Esta es una de las trampas del autoboxing.