В JEP 406 (первая предварительная версия, Java 17) условия в защищенных шаблонах слегка проверяются на правильный порядок доминирования:
Метка шаблона в форме регистра p доминирует над меткой шаблона в форме регистра p && e, т. е. где шаблон — это защищенная версия исходного шаблона. Например, случай метки шаблона String s доминирует над случаем метки шаблона String s && s.length() > 0, поскольку каждое значение, соответствующее защищенному шаблону String s && s.length() > 0, также соответствует шаблону String s.
Компилятор проверяет все метки шаблонов. Если метка шаблона в блоке переключателей доминирует над меткой более раннего шаблона в этом блоке переключателей, это ошибка времени компиляции.
В JEP 420 ( вторая предварительная версия, Java 18), эти проверки удалены:
Метка защищенного шаблона доминирует над константной меткой, если содержащаяся в ней метка доминирует; мы не проверяем защитное выражение, так как это вообще неразрешимо.
Итак, хотя это вызывает (действительную) ошибку компилятора в Java 17:
Код: Выделить всё
static void dominanceExampleWithConstant(Object obj) {
switch (obj.toString()) {
case String str when str.length() > 5 -> System.out.println(str);
case "Sophie" -> System.out.println("My lovely daughter");
default -> System.out.println("FALLBACK");
}
}
Мои вопросы:
- Почему эта проверка компилятора была удалена?
- Почему она была реализована вообще?
- Привела ли версия Java 17 к случаям (ха-ха) в котором компилятор выдал "несправедливую" ошибку?
Подробнее здесь: https://stackoverflow.com/questions/791 ... ared-to-je