以下の単純なコードでは、「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のバグですか?