2

以下の単純なコードでは、「Factory」インターフェイスを確認できます。それらの間の唯一の違いは、次のようにFactory0Bad拡張されることSupplierです。

@FunctionalInterface
public static interface Factory0Bad<T> extends Supplier<T> {
    T get();
}

@FunctionalInterface
public static interface Factory0Good<T>  {
    T get();
}

public static class Handler {}
public static class HandlerA extends Handler {}

public static void main(String[] args) {
    // this line compiles
    Factory0Good<? extends Handler> good = HandlerA::new;

    // this does not!
    Factory0Bad<? extends Handler> bad = HandlerA::new;
}

だからライン

Factory0Good<? extends Handler> good = HandlerA::new;

はコンパイラ (1.8.0u05) によって受け入れられますが、この行

Factory0Bad<? extends Handler> bad = HandlerA::new;

ではありません。

どうしてこれなの?ここで何が欠けていますか?javacのバグですか?

4

1 に答える 1