无法在没有类型参数的情况下分配给函数

时间:2018-04-05 12:56:55

标签: java generics

我不明白为什么没有类型参数的函数赋值会产生编译错误:

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不有效。

1 个答案:

答案 0 :(得分:1)

f1无效,因为f1使用原始类型,类型推断算法可能不会尝试处理它,因为原始类型是与Java 5之前的代码交互的传统功能;如果您正在使用lambdas,则不使用Java 5之前的代码(此处)。

f2是有效的,因为您正在进行类型推断算法所没有的工作。

f3无效,因为Integer不是Object。你说“你可以将Object传递给f3;但是lambda需要你传递的任何内容都是Integer

f4有效,因为类型是一致的。