通常我会这样做:
Function<Integer, Integer> a = b -> b * 2;
System.out.println(a.apply(3)); // prints 6我很惊讶地看到下面的EL表达式是有效的:
${a = b -> b * 2; a(3)}上面EL表达式的结果是6。当在代码段2中声明a时,编译器如何确定类型,但在代码段1中需要类型信息?
即使这样编译和执行也很好:
${(b -> b * 2)(3)}发布于 2018-02-23 23:03:49
EL求值器/执行器不知道EL表达式中a的确切类型。因为*操作,它只知道它应该是一个Number
${a = b -> b * 2; a(3)}看看这些结果:
${a = b -> b * 2; a(3)}
6
${a = b -> b * 2; a('32')}
64
${a = b -> b * 2; a('32s')}
java.lang.NumberFormatException: For input string: "32s"因此,只有在运行时才会出现异常,因为Long.parse("32s")会失败。
看看这段ELArithmetic.java#211的源代码
发布于 2018-02-23 22:55:09
从根本上说,编译器能够推断类型。如果稍微修改一下代码片段1的结构,就可以在不显式声明Integer类型的情况下进行编译
public static <V, R> R apply(Function<V, R> foo, V v) {
return foo.apply(v);
}
System.out.println(apply(b -> b * 2, 3)); // prints 6这与语法很接近:${(b -> b * 2)(3)}编译器只是在推断lambda表达式的参数类型方面有特殊的困难。
https://stackoverflow.com/questions/48949303
复制相似问题