19

私はしばらくの間、次のようなカスタム インターフェイスを使用してきました。

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);
}

最初のバージョンがコンパイルされない理由はありますか?

4

1 に答える 1