2

在下面的简单代码中,我可以看到“工厂”接口,它们之间的唯一区别是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

1
 // this does not!
        // 1.8.0_05 - fails
        // 1.8.0_40 - succeeds
        // 1.8.0_45 - succeeds
        Factory0Bad<? extends Handler> bad = HandlerA::new;
于 2015-06-26T10:00:07.423 回答