功能接口继承怪癖
2022-09-02 13:58:52
我有一个自定义界面,我已经使用了一段时间,看起来像这样:
public interface Function<T, R> {
R call(T input);
}
我想用Java的函数和Guava的函数
来改造这个界面,同时保持它的
FunctionEntInterface
。我以为我有完美的安排:
@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);
}
第一个版本无法编译是有原因的吗?