Salida inesperada cuando se usa un operador ternario y una variable final

Considere este fragmento de código:

public static void main(String[] args) {
    int z1 = 0;
    final int z2 = 0;
    System.out.println(false ? z1 : 'X');
    System.out.println(false ? z2 : 'X');
}

Al ejecutar este código, esperaría ver dosX en tu consola Sin embargo, la salida real es:

88
X

Si echamos un vistazo a laEspecificaciones de Java sobre el operador ternario, Encontramos eso

Si uno de los operandos es de tipo T donde T es byte, short o char, y el otro operando es una expresión constante de tipo int cuyo valor es representable en tipo T, entonces el tipo de expresión condicional es T.

Entonces el primer resultado considera el'X' char como unintpor eso imprime88.

Sin embargo, no estoy seguro de entender por qué el uso definal cambia el comportamiento para la segunda salida.

Respuestas a la pregunta(1)

Su respuesta a la pregunta