конечная переменная (даже если ничто иное не присваивает ей значение), поэтому она не является константной переменной и, следовательно, не является константным выражением - поэтому параграф, указанный в спецификации, не применяется.
отрим этот фрагмент кода:
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 является байтом, коротким или char, а другой операнд является константным выражением типа int, значение которого представимо в типе T, тогда тип условного выражения - T.
Таким образом, первый вывод учитывает'X'
символ какint
поэтому печатает88
.
Тем не менее, я не уверен, чтобы понять, почему использованиеfinal
изменяет поведение для второго выхода.