【问题标题】:Java type inference differences between javac 1.8.0_45 and javac 1.8.0_92?javac 1.8.0_45 和 javac 1.8.0_92 之间的 Java 类型推断差异?
【发布时间】:2017-06-11 08:24:10
【问题描述】:

我有一些使用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());
    }

    // ...
}

但是,对于javac 1.8.0_45,需要一些额外的类型(L):

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

您可以想象,这会导致用户从源代码构建的软件包出现问题。

  • 这是为什么呢?

  • 这是特定 Java 版本的错误吗?

【问题讨论】:

标签: java type-inference


【解决方案1】:

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

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

已为 Java 9 提交了修复,但他们也将其向后移植到 8u60:

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

【讨论】:

    猜你喜欢
    • 2017-07-05
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多