У меня есть пользовательский интерфейс я использую в течение некоторого времени, который выглядит примерно так:Функциональный интерфейс Наследование Куирк
public interface Function<T, R> {
R call(T input);
}
Я хотел бы модифицировать этот интерфейс с обоими в Java Function
, а также гуавы-х Function
, сохраняя при этом FunctionalInterface
. Я думал, что идеальное расположение:
@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);
}
}
Оба суперинтерфейсов декларировать же apply()
метода, который был реализован в моем интерфейсе, оставляя только абстрактные call()
метод. Как ни странно, он не будет компилироваться, сообщая мне
Аннотации недействительные '@FunctionalInterface'; Функция < T, R > не функциональный интерфейс
Незнакомец по-прежнему, следующие варианты компиляции просто отлично:
@FunctionalInterface
public interface Function<T, R> extends
java.util.function.Function<T, R> {
R call(T input);
@Override
default R apply(T input) {
return call(input);
}
}
@FunctionalInterface
public interface Function<T, R> extends
com.google.common.base.Function<T, R> {
R call(T input);
@Override
default R apply(T input) {
return call(input);
}
}
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);
}
}
@FunctionalInterface
public interface Function<T, R> extends
java.util.function.Function<T, R>,
com.google.common.base.Function<T, R> {
@Override
R apply(T input);
}
Есть ли причина, по которой первая версия не будет компилироваться?
Вашего третий один компилируется, потому что вы не добавили ограничения, что оно должно быть '@ FunctionalInterface' (это аннотация подтвержден компилятором). –
@SotiriosDelimanolis, очевидно. – shmosel
Собираетесь ли вы с Eclipse? Компиляция отлично с компилятором Oracle. –