在Groovy中使用类型参数关闭

Ada*_*deg 12 groovy closures static-typing groovy++

我想更清楚地了解关于他们的论证类型的闭包.所以我会写类似的东西

List<Y> myCollect(List<X> list, Closure<X,Y> clos) { ... }
Run Code Online (Sandbox Code Playgroud)

我知道Groovy不会使用该类型信息,但Groovy ++可能会在编译时使用它.这可以实现(除了将其纳入评论)?

更新:标题可能听起来有误导性,但我认为上面的例子会让它更清晰.我有兴趣指定一个闭包的类型,它是某个函数的参数.假设,我想重新启动内置功能collect.所以我对写作感兴趣myCollect,而不是写作clos.我想要实现的是获取编译时错误

myCollect(['a', 'ab'], { it / 2 }) // compile error
myCollect(['a', 'ab'], { it.size() })  // OK 
Run Code Online (Sandbox Code Playgroud)

Dón*_*nal 8

您可以定义闭包的参数类型,但上面显示的语法不正确.这是一个没有参数类型的闭包:

def concatenate = {arg1, arg2 ->
  return arg1 + arg2
}
Run Code Online (Sandbox Code Playgroud)

这是与参数类型相同的闭包

def concatenate = {String arg1, String arg2 ->
  return arg1 + arg2
}
Run Code Online (Sandbox Code Playgroud)

我知道Groovy不会使用该类型信息,但Groovy ++可能会在编译时使用它.

Groovy确实进行了一些编译时类型检查,但没有Groovy ++(或Java)那么多.即使在编译时未使用类型信息,它也会在运行时进行检查,并且作为一种文档形式也很有价值.