我有一个将闭包作为其参数之一的方法,我希望使用@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
是错误的用例。但是我还没有找到如何将两个闭包的参数“声明”传递给方法签名的方法。
可能吗??有人可以帮忙吗?
P.S。当我使用注释时,我不仅期望为将来的读者进行描述,而且还希望帮助IDEA推断参数的类型。但是我没有得到那个结果?我做错了,还是IDEA不支持此功能?
答案 0 :(得分:1)
在这种情况下,您可以将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参数建议: