我想更清楚地了解关于他们的论证类型的闭包。所以我会写类似
的东西List<Y> myCollect(List<X> list, Closure<X,Y> clos) { ... }
我知道Groovy不会使用该类型信息,但Groovy ++可能会在编译时使用它。这可以实现(除了将其置于评论中)吗?
更新:
标题可能听起来有误导性,但我认为上面的例子会让它更清晰。我有兴趣指定一个闭包的类型,它是某个函数的参数。假设,我想重新定义内置的collect
。所以我有兴趣写myCollect
,而不是写clos
。我想要实现的是获取编译时错误
myCollect(['a', 'ab'], { it / 2 }) // compile error
myCollect(['a', 'ab'], { it.size() }) // OK
答案 0 :(得分:8)
您可以定义闭包参数的类型,但上面显示的语法不正确。这是一个没有参数类型的闭包:
def concatenate = {arg1, arg2 ->
return arg1 + arg2
}
这是与参数类型相同的闭包
def concatenate = {String arg1, String arg2 ->
return arg1 + arg2
}
我知道Groovy不会使用该类型信息,但Groovy ++可能会在编译时使用它。
Groovy确实进行了一些编译时类型检查,但没有Groovy ++(或Java)那么多。即使在编译时没有使用类型信息,它也会在运行时进行检查,并且作为一种文档形式也很有价值。
答案 1 :(得分:2)
我认为你不再使用Groovy ++了,但即使你这样做也行不通。它肯定适用于静态类型的Groovy 2.x
interface Z {
void callback(X x, Y y)
}
List<Y> myCollect(List<X> list, Z clos) {
...
clos.callback(x, y)
}
然后呼叫者用正常情况调用它:
List<Y> object.myConnect(list) { X x, Y y ->
}
如果你输出参数并拥有@CompileStatic,编译器会选择丢失的参数或错误的类型。
这是有效的,因为1方法接口等同于Groovy中的闭包。