Причина заключается в следующем определении в Спецификация языка Java®, §15.25.3
15.25.3.Условные условные выражения
Условное условное выражение - это поли-выражение, если оно появляется в контексте присваивания или в контексте вызова ( §5.2 . §5.3 ).В противном случае это автономное выражение.
Поскольку контексты приведения отсутствуют в списке, условное условное выражение в этом контексте является автономным выражением, что означает, чтоего тип результата определяется только типами аргументов.Поскольку ссылки на методы не имеют собственного типа, но полагаются на целевой тип, они не могут использоваться здесь (без конструкции, предоставляющей другой тип).
Сравните с §15.13 :
Выражения ссылки на метод всегда являются выражениями поли ( §15.2 ).
Ошибка времени компиляции, если выражение ссылки методапроисходит в программе в другом месте, кроме контекста присваивания ( §5.2 ), контекста вызова ( §5.3 ) или контекста приведения ( §5.5 ).
Таким образом, хотя контекст приведения является допустимым местоположением для ссылки на метод в целом, сочетание контекста приведения и условного выражения оказывается недопустимым из-за изолированной природы выраженияусловного в контексте приведения.
Если мы не предоставляем явные типы в выражении, как, например, с
args.length > 0 ? (Supplier<String>)Lambda::foo : (Supplier<String>)Lambda::bar
.
Последствия этого правила могут быть продемонстрированыс другим примеры, кроме лямбда-выражений или ссылок на методы, когда они могут быть поли-выражениями:
// poly expression, infers List<Number> for Arrays.asList(0) and 0 is assignable to Number
List<Number> list = args.length>0? Arrays.asList(0): null;
// stand-alone expression, fails with "List<Integer> cannot be converted to List<Number>"
List<Number> list = (List<Number>)(args.length>0? Arrays.asList(0): null);
Я не знаю, почему контекст приведения не подходит для условного выражения-ссылки, чтобы быть выражением поли, но этокак это было указано для Java 8 до Java 11…