14

我想更明确地说明我关于它们的参数类型的闭包。所以我会写类似

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 
4

3 回答 3

10

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

def concatenate = {arg1, arg2 ->
  return arg1 + arg2
}

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

def concatenate = {String arg1, String arg2 ->
  return arg1 + arg2
}

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

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

于 2011-04-18T09:21:18.323 回答
3

我认为您不再使用 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 中的闭包。

于 2014-05-27T10:52:04.413 回答
0

对于仍在寻找答案的任何人:看看@ClosureParams,它提供了有关预期闭包参数类型的 IDE 提示

于 2022-01-29T12:13:26.437 回答