Неожиданный результат при использовании тернарного оператора и конечной переменной

Рассмотрите этот фрагмент кода:

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

При запуске этого кода я ожидал бы увидеть два X в вашей консоли. Однако реальный результат:

88
X

Если мы посмотрим на спецификации Java, касающиеся тернарного оператора , мы обнаружим, что

Если один из операндов имеет тип T, где T - байтовый, короткий или символьный, и другой операнд - постоянное выражение типа int, значение которого может быть представлено в типе T, тогда тип условного выражения - T.

Таким образом, первый вывод рассматривает 'X' char как int , поэтому он печатает 88 .

Однако я не уверен, что понимаю, почему использование final меняет поведение для второго вывода.

12
задан Romain Linsolas 17 January 2011 в 09:16
поделиться