Ho un'interfaccia personalizzata che ho usato per un po 'di tempo che sembra qualcosa di simile:funzionale interfaccia Inheritance Quirk
public interface Function<T, R> {
R call(T input);
}
vorrei retrofit questa interfaccia sia con Java di Function
così come Guava di Function
, pur mantenendolo a FunctionalInterface
. Pensavo di avere la perfetta organizzazione:
@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);
}
}
Entrambi superinterfacce dichiarano lo stesso apply()
metodo, che è stato implementato nella mia interfaccia, lasciando solo il metodo astratto call()
. Stranamente, non verrà compilato, dicendomi
Annotazione "@FunctionalInterface" non valida; Funzione < T, R > non è un'interfaccia funzionale
Peggio ancora, le seguenti variazioni compilare bene:
@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);
}
C'è un motivo per cui la prima versione non verrà compilata?
tuo terzo compila perché non si è aggiunto il vincolo che deve essere un '@ FunctionalInterface' (che è un'annotazione convalidato dal compilatore). –
@SotiriosDelimanolis, ovviamente. – shmosel
Stai compilando con Eclipse? Compilano bene con il compilatore di Oracle. –