java - predefined - Herencia de la interfaz funcional
java lambda predefined interfaces (1)
Como se indica en los comentarios, se compila bien con el compilador de Oracle. Es un error de eclipse.
A la espera de una corrección de errores, personalmente eliminaré la anotación @FunctionalInterface
(su tercera variación):
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);
}
}
El mayor inconveniente de esta solución es que el error del compilador de eclipse evita el uso de la Function
como un tipo de destino lambda .
Si realmente desea mantener @FunctionalInterface
en su Function
, una solución (fea) podría ser introducir una interfaz intermedia:
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;
}
}
y deja que tu Function
extienda este AdapterFunction
:
@FunctionalInterface
public interface Function<T, R>
extends
AdapterFunction<T, R> {
R call(T input);
@Override
default R apply(T input) {
return call(input);
}
}
En este caso, la Function
es también un tipo de destino válido para eclipse:
Function<String, Object> function = st -> st.toString();
Tengo una interfaz personalizada que he estado usando durante un tiempo que se parece a esto:
public interface Function<T, R> {
R call(T input);
}
Me gustaría actualizar esta interfaz tanto con la Function
de Java como con la Function
de Function
, mientras mantengo una interfaz FunctionalInterface
. Pensé que tenía el arreglo perfecto:
@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);
}
}
Ambas superinterfaces declaran el mismo método apply()
, que se ha implementado en mi interfaz, dejando solo el método abstract call()
. Curiosamente, no compilará, diciéndome
Anotación ''@FunctionalInterface'' inválida; La función <T, R> no es una interfaz funcional
Aún más extraño, las siguientes variaciones compilan muy bien:
@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);
}
¿Hay alguna razón para que la primera versión no compile?