java - Functional Interface Inheritance Quirk -
i have custom interface i've been using time looks this:
public interface function<t, r> { r call(t input); } i'd retrofit interface both java's function guava's function, while keeping functionalinterface. thought had perfect arrangement:
@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); } } both superinterfaces declare same apply() method, has been implemented in interface, leaving abstract call() method. strangely, won't compile, telling me
invalid '@functionalinterface' annotation; function<t,r> not functional interface
stranger still, following variations compile fine:
@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); } is there reason first version won't compile?
as stated in comments, compiles fine oracle compiler. eclipse bug.
awaiting bug fix, remove annotation @functionalinterface (your 3rd variation):
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); } } the major inconvenient of solution eclipse compiler bug prevent using function lambda target type.
if want keep @functionalinterface on function, (ugly) workaround might introduce intermediate interface:
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; } } and let function extends adapterfunction:
@functionalinterface public interface function<t, r> extends adapterfunction<t, r> { r call(t input); @override default r apply(t input) { return call(input); } } in case, function valid target type eclipse too:
function<string, object> function = st -> st.tostring();
Comments
Post a Comment