Ответ 1
Как указано в комментариях, он компилируется с помощью компилятора oracle. Это ошибка затмения.
Ожидая исправления ошибки, я лично удалю аннотацию @FunctionalInterface
(ваш третий вариант):
public interface Function<T, R>
extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {
R call(T input);
@Override
default R apply(T input) {
return call(input);
}
}
Основным неудобством этого решения является то, что ошибка компилятора eclipse предотвращает использование Function
в качестве лямбда-целевого типа.
Если вы действительно хотите сохранить @FunctionalInterface
на своем Function
, обходным путем (уродливым) может быть представление промежуточного интерфейса:
public interface AdapterFunction<T, R>
extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {
@Override
default R apply(T input) {
return null;
}
}
и пусть ваш Function
расширяет этот AdapterFunction
:
@FunctionalInterface
public interface Function<T, R>
extends
AdapterFunction<T, R> {
R call(T input);
@Override
default R apply(T input) {
return call(input);
}
}
В этом случае Function
также является допустимым типом цели для eclipse:
Function<String, Object> function = st -> st.toString();