with predefined not interfaces functions functional example java lambda java-8 default-method functional-interface

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?