Saída inesperada ao usar um operador ternário e variável final

Considere este trecho 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');
}

Ao executar esse código, eu esperaria ver doisX no seu console. No entanto, a saída real é:

88
X

Se dermos uma olhada noEspecificações Java relativas ao Operador Ternário, nós achamos isso

Se um dos operandos for do tipo T, em que T é byte, curto ou char, e o outro operando for uma expressão constante do tipo int, cujo valor é representável no tipo T, o tipo da expressão condicional será T.

Portanto, a primeira saída considera o'X' char como umint, é por isso que imprime88.

No entanto, não sei ao certo por que o uso definal altera o comportamento para a segunda saída.

questionAnswers(1)

yourAnswerToTheQuestion