私はしばらくの間、次のようなカスタム インターフェイスを使用してきました。
public interface Function<T, R> {
R call(T input);
}
Function
このインターフェースを Javaと Guava の両方で改造したいのですFunction
が、FunctionalInterface
. 私は完璧な配置を持っていると思いました:
@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」注釈が無効です。Function<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);
}
最初のバージョンがコンパイルされない理由はありますか?