为什么 java 不能为函数式接口推断类型,但仍然适用于常规语句?

n00*_*ter -2 java functional-interface

我正在使用 Java 中的函数式接口,现在我正在尝试定义一个长函数,它可以做一些简单的事情,比如添加数字或其他什么。

但是,如果我尝试这样做,同时将 Integer 作为 longfunction 的类型,如下所示:

LongFunction<Integer> i = (l) -> l + l;
Run Code Online (Sandbox Code Playgroud)

但是这不起作用,我的编译器抱怨并说“lambda 表达式中的返回类型错误:long 无法转换为整数”。如果 long 通常无法转换为整数,这将是有意义的。

但我完全有能力做到这一点:

    int a = 1;
    int b = 5;
    long l = a +b;
Run Code Online (Sandbox Code Playgroud)

为什么是这样?为什么 java 完全能够将 long 转换为 int 以及正常情况下的其他方式,但在 lambda 中要严格得多?

Dav*_*sta 5

为什么java完全能够将long转换为int,反之亦然......

它不是。它将转换intlong,这就是您的第二个代码段显示的内容。它不会做相反的事情。

这将产生一个编译器错误:

    long a = 1;
    long b = 5;
    int l = a +b;
Run Code Online (Sandbox Code Playgroud)

由于并非所有long值都可以存储在 中int,因此不支持在此方向上进行转换。