首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy中带有类型化参数的闭包

Groovy中带有类型化参数的闭包
EN

Stack Overflow用户
提问于 2011-04-16 03:46:32
回答 3查看 9.9K关注 0票数 14

我想更明确地说明我的闭包关于它们的参数类型。所以我会写下这样的东西

代码语言:javascript
复制
List<Y> myCollect(List<X> list, Closure<X,Y> clos) { ... }

我知道Groovy不会使用这种类型信息,但Groovy++可能会在编译时使用它。这可以实现吗(除了把它放到评论中)?

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

代码语言:javascript
复制
myCollect(['a', 'ab'], { it / 2 }) // compile error
myCollect(['a', 'ab'], { it.size() })  // OK 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-18 17:21:18

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

代码语言:javascript
复制
def concatenate = {arg1, arg2 ->
  return arg1 + arg2
}

下面是带有参数类型的相同闭包

代码语言:javascript
复制
def concatenate = {String arg1, String arg2 ->
  return arg1 + arg2
}

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

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

票数 10
EN

Stack Overflow用户

发布于 2014-05-27 18:52:04

我假设您不再使用Groovy++了,但是即使您使用了,它也可能会起作用。它当然适用于静态类型的Groovy 2.x

代码语言:javascript
复制
interface Z {
  void callback(X x, Y y)
}

List<Y> myCollect(List<X> list, Z clos) { 
  ... 

  clos.callback(x, y)
}

然后,调用者使用正常调用它:

代码语言:javascript
复制
List<Y> object.myConnect(list) { X x, Y y -> 
}

如果省略了一个参数,而使用了@CompileStatic,编译器就会找出缺少的参数或错误的类型。

这是因为1方法接口等同于Groovy中的闭包。

票数 3
EN

Stack Overflow用户

发布于 2022-01-29 12:13:26

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5681601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档