为什么在Groovy中忽略函数〈T,R>中的返回类型?

dzjeubhm  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(129)

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

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()

92dk7w1h

92dk7w1h1#

下面的代码

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是动态的--除非指定了这个(CompileStatic),否则没有类型检查
    1.闭包不实现函数。所以,当你把闭包赋给函数时- groovy试图通过一个函数接口来委托闭包。它将是动态的,即使你使用compile static...

相关问题