通常我会这样做:
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)}
最佳答案
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的源代码
关于jakarta-ee - 表达式语言 lambda 类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48949303/