如何使用@ClosureParams关闭需要两个参数?

时间:2018-08-20 14:01:54

标签: groovy closures

我有一个将闭包作为其参数之一的方法,我希望使用@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不支持此功能?

1 个答案:

答案 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参数建议:

enter image description here

enter image description here