为什么 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
中,因此不支持此方向的转换。
我正在 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
中,因此不支持此方向的转换。