在Groovy中使用类型参数关闭

时间:2011-04-15 19:46:32

标签: groovy closures static-typing groovy++

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

的东西
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 

2 个答案:

答案 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中的闭包。