我想更明确地说明我的闭包关于它们的参数类型。所以我会写下这样的东西
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 发布于 2011-04-18 17:21:18
您可以定义闭包参数的类型,但是上面显示的语法是不正确的。下面是一个不带参数类型的闭包:
def concatenate = {arg1, arg2 ->
return arg1 + arg2
}下面是带有参数类型的相同闭包
def concatenate = {String arg1, String arg2 ->
return arg1 + arg2
}我知道Groovy不会使用这种类型信息,但Groovy++可能会在编译时使用它。
Groovy确实做了一些编译时的类型检查,但没有Groovy++ (或Java)那么多。即使在编译时不使用类型信息,它也会在运行时被检查,并且作为文档的一种形式也很有价值。
发布于 2014-05-27 18:52:04
我假设您不再使用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中的闭包。
发布于 2022-01-29 12:13:26
对于任何还在寻找答案的人来说:看看@ClosureParams,它提供了关于预期闭包参数类型的提示
https://stackoverflow.com/questions/5681601
复制相似问题