【发布时间】:2011-08-06 14:22:53
【问题描述】:
我想更明确地说明我的闭包参数类型。所以我会写一些类似的东西
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
【问题讨论】:
-
在闭包
类型中,V代表闭包的返回值,而不是它的参数。因此,有一个 Closure 是没有意义的,因为你不能返回两个值。 -
我的意思是
Closure<X,Y>接受单个X作为输入并返回Y。所以它可以应用于List<X>的项目。我更新了函数的返回类型。 -
现在接受的答案应该是来自 Richard Vowles 的答案:stackoverflow.com/a/23887505/1915920,因为它涉及到闭包接口/函数的重新定义和相关的类型检查。
标签: groovy closures static-typing groovy++