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

1tu0hz3e  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(541)

我正在用java处理一些函数接口,现在我正在尝试定义一个longfunction,它可以做一些简单的事情,比如添加数字或其他什么。
但是,如果我在将integer作为long函数的类型时尝试这样做,如下所示:

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

但是这不起作用,我的编译器抱怨说“lambda表达式中的返回类型不正确:long不能转换为整数”。如果long通常不能转换成整数,这就有意义了。
但我完全可以做到:

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

为什么会这样?为什么java完全能够将long转换成int,而通常情况下是相反的,但是在lambda中却更加严格?

brvekthn

brvekthn1#

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

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

尽管返回类型是long,但下面的代码对int和long都适用。

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

但这不会,因为这将是lambda内部的一个缩小操作,然后才转换为最终结果的long。

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
vshtjzan

vshtjzan2#

为什么java完全能够将long转换成int,反之亦然。。。
不是的。它将转换 intlong ,这是您的第二个代码段显示的内容。它不会做相反的事。
这将生成编译器错误:

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

因为不是所有的 long 值可以存储在 int ,不支持此方向的转换。

相关问题