为什么 java 无法推断功能接口的类型,但仍然适用于常规语句?

Why is java not able to infer types for functional interfaces, but still work for regular statements?

我正在 java 中使用函数接口,现在我正在尝试定义一个长函数来做一些简单的事情,比如添加数字或其他。

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

LongFunction<Integer> i = (l) -> l + l;

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

但我完全可以做到:

    int a = 1;
    int b = 5;
    long l = a +b;

这是为什么?为什么 java 完全能够将 long 型转换为 int 型,而正常情况下反之亦然,但在 lambda 中却要严格得多?

您的示例将整数转换为长整数,这是一种扩展操作,不会导致信息丢失。所以没有问题。从 long 到 int 可能会导致信息丢失,因此需要转换。

interface MyBiFunction<R,S,T>{
        public T apply(R a, S b);
}

即使 return 类型是 long,以下内容也适用于 int 和 long。

MyBiFunction<Integer, Long, Long> fnc1 = (a,b)-> a * b;
long intresult1 = fnc1.apply(10,20L);
long longresult1 = fnc1.apply(10,20l);

但这不会,因为在将其转换为 long 以获得最终结果之前,这将是 lambda 内部的缩小操作。

MyBiFunction<Integer, Long, Integer> fnc2 = (a,b)-> a * b;
long longresult2 = fnc2.apply(10,20l);

which is the same as 

int a = 10; // ok
long b = 20L; //ok
int v = a*b; //  problem  long*int = long.  Can't assign to int without cast
long longresult2 = v; //ok

why is java perfectly able to convert long's to int's and the other way around ...

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

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

    long a = 1;
    long b = 5;
    int l = a +b;

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