当前位置: 首页 > 知识库问答 >
问题:

javac 1.8.0_45和javac 1.8.0_92的Java类型推断区别?

娄嘉石
2023-03-14

我有一些用< code>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版本的错误吗?

  • 共有1个答案

    方飞翼
    2023-03-14

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

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

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

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

     类似资料:
    • 问题内容: 它们有何不同?我有点困惑,因为它们似乎是相似的概念。 了解它们如何帮助优化编译时间? 问题答案: 从Swift自己的文档中: 类型安全 Swift是一种类型安全的语言。类型安全的语言鼓励您清楚代码可以使用的值的类型。 如果代码的一部分需要一个String,则不能错误地将其传递给Int。 类型推断 如果您 未 指定所需的值类型,则Swift会使用类型推断来得出适当的类型。通过类型推断,编

    • 为什么Java可以推断出多个上限类型的共同祖先,而不能推断出下限类型的共同祖先? 更具体地说,请考虑以下示例:

    • 问题内容: 我已经安装了最后一个JDK 8 ea b114,以测试新的语言功能。但是,链式调用中的推断似乎还行不通。 如果我写: 编译器给我一个错误。 但是,论据位置的推断效果很好。 也许不会插入链接呼叫的推论? 问题答案: 最新的规范(公共评论)可从jcp.org获得。D部分有一段讨论了这一点。 方法调用,字段访问等(exp.foo())中的接收者不是多义表达式,因为目标类型是未知的-不可能枚举

    • 主要内容:1 Java8 类型推断的介绍,2 Java8 类型推断的案例1,3 Java8 类型推断的案例21 Java8 类型推断的介绍 类型推断是Java的一项功能,它使编译器可以查看每个方法调用和相应的声明以确定参数的类型。 Java在Java 8中提供了类型推断的改进版本。 1.1 Java8以前 在下面的声明中,我们在一侧提到了arraylist的类型。这种方法是在Java 7中引入的。在这里,您可以将第二面留为<>,并且编译器将通过引用变量的类型来推断其类型。 1.2 Java8以后

    • TypeScript 类型检查机制包含三个部分: 类型推断 类型保护 类型兼容性 本节介绍其中的类型推断,类型推断主要用于那些没有明确指出类型的地方帮助确定和提供类型,这是 TypeScript 的一种能力。 类型推断是有方向的,要注意区分从左向右和从右向左两种推断的不同应用。 1. 慕课解释 类型推断的含义是不需要指定变量类型或函数的返回值类型,TypeScript 可以根据一些简单的规则推断其