我有一个以闭包作为其参数之一的方法,我希望使用 @ClosureParam
注释来转换输入闭包的参数:
def <T> List<T> randomInstances( final int size, final Builder<T> builder,
@ClosureParams( SecondParam.FirstGenericType )
final Closure<Void> postProcessor = null ) {
( 0..<size ).collect {
def instance = builder.build()
if ( postProcessor ) {
postProcessor( instance )
}
instance
}
}
现在,我添加了第二个方法,它可以执行相同的操作,但闭包将接收两个参数:
def <T> List<T> randomInstances( final List<?> listToIterate,
final Builder<T> builder,
@ClosureParams( FirstParam.FirstGenericType )
@ClosureParams( SecondParam.FirstGenericType )
final Closure<Void> postProcessor = null )
我很确定两个 @ClosureParams
串联是错误的用例。但我还没有找到如何将两个闭包的参数“声明”传递给方法签名的方法。
是否可以??有人可以帮忙吗?
附注当我使用注释时,我不仅希望为 future 的读者进行描述,而且还可以帮助 IDEA 推断参数的类型。但我没有得到这个结果?我做错了什么,还是IDEA不支持这个功能??
最佳答案
在这种情况下,您可以使用 groovy.transform.stc.FromString
使用 ["T,U", "T"]
选项:
@ClosureParams(value = groovy.transform.stc.FromString, options = ["T,U", "T"])
这是一个简短的示例:
class Lists {
static <T,U> List<T> randomInstances(List<U> listToIterate, final Builder<T> builder, @ClosureParams(value = FromString, options = ["T,U", "T"]) final Closure<T> postProcessor = null) {
(0..<listToIterate.size()).collect {
def instance = builder.build()
if (postProcessor) {
postProcessor(instance)
}
instance
}
}
}
对于给定的方法定义,IDE 参数建议如下所示:
关于groovy - 如何使用 @ClosureParams 来实现需要两个参数的闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51932440/