下面的简单代码解释了我的困惑:
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
- groovy是动态的——没有类型检查,除非你指定了this (CompileStatic)
- 闭包没有实现函数。因此,当您将闭包分配给函数时,groovy尝试通过函数接口来委托闭包。它将是动态的,即使你使用编译静态…