javac 1.8.0_45和javac 1.8.0_92之间的Java类型推断差异?

sdg*_*sdh 6 java type-inference

我有一些编译的代码javac 1.8.0_92:

public final class Either<L, R> {

    // ...

    private final L l;
    private final R r;

    // ...

    public <T> T join(final Function<L, T> f, final Function<R, T> g) {
        Preconditions.checkNotNull(f);
        Preconditions.checkNotNull(g);
        return which == LeftOrRight.LEFT ?
            f.apply(l) :
            g.apply(r);
    }

    public Optional<L> left() {
        return join(Optional::of, x -> Optional.empty());
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,有javac 1.8.0_45一些额外的类型是必需的(L):

     public Optional<L> left() {
         return join(Optional::<L>of, x -> Optional.<L>empty());
     }
Run Code Online (Sandbox Code Playgroud)

可以想象,这会导致用户从源构建的包出现问题.

  • 为什么是这样?

  • 这是特定Java构建的错误吗?

Luc*_*ens 5

是的,这是JDK错误,其中类型推断因嵌套调用而失败.如果您设置其中一个参数null,则代码将编译.

https://bugs.openjdk.java.net/browse/JDK-8055963

为Java 9提交了一个修复程序,但它们也将其向后移植到8u60:

https://bugs.openjdk.java.net/browse/JDK-8081020