为什么 Function<T, R> 中的返回类型在 Groovy 中被忽略?



下面的简单代码解释了我的困惑:

class Main {
static void f(Function<Float, Float> c) {
println(c.apply(0.0f))
}
static void main(String[] args) {
Closure<String> c = {"hi"}
f(c)
}
}

我不知道为什么编译器不抱怨Closure<String>不适合Function<Float, Float>。似乎我可以传递任何东西给f()

以下代码

import java.util.function.*
def c = {"result $it :: ${it.getClass()}"}
Function<Float, Float> f = c
println "f: ${f.getClass()}   ${f instanceof Function}"
println "c: ${c.getClass()}   ${c instanceof Function}"
println f.apply(0.1)

打印

f: class com.sun.proxy.$Proxy22   true
c: class ConsoleScript10$_run_closure1   false
result 0.1 :: class java.math.BigDecimal

  1. groovy是动态的——没有类型检查,除非你指定了this (CompileStatic)
  2. 闭包没有实现函数。因此,当您将闭包分配给函数时,groovy尝试通过函数接口来委托闭包。它将是动态的,即使你使用编译静态…

最新更新