我不明白为什么没有类型参数的函数赋值会产生编译错误:
Function f1 = (Integer x) -> x;
我不明白为什么,因为我可以这样做:
Function f2 = (Function<Integer, Integer>)((Integer x) -> x);
f1和f2具有相同的类型,但我可以进行第二次分配但不是第一次。
我也无法做以下作业
Function<Object, Object> f3 = (Integer x) -> x;
但可以做到这一点:
Function<Integer, Object> f4 = (Integer x) -> x;
请解释为什么f2,f4有效而f1和f3不有效。
答案 0 :(得分:1)
f1
无效,因为f1
使用原始类型,类型推断算法可能不会尝试处理它,因为原始类型是与Java 5之前的代码交互的传统功能;如果您正在使用lambdas,则不使用Java 5之前的代码(此处)。
f2
是有效的,因为您正在进行类型推断算法所没有的工作。
f3
无效,因为Integer
不是Object
。你说“你可以将Object
传递给f3
;但是lambda需要你传递的任何内容都是Integer
。
f4
有效,因为类型是一致的。