Take the 2-minute tour ×

I'd like to be more explicit about my closures regarding their argument types. So I would write something like

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

I know that Groovy won't use that type information, but Groovy++ may use it at compile time. Can this be be achieved (other than putting it into a comment)?

UPDATE: The title may sound misleading, but I thought the above example would make it clearer. I'm interested in specifying types of a closure which is the argument of some function. Suppose, I want to redefince the built-in collect. So I'm interested in writing myCollect, not in writing clos. What I want to achieve is get compile time errors

myCollect(['a', 'ab'], { it / 2 }) // compile error
myCollect(['a', 'ab'], { it.size() })  // OK 
share|improve this question
In the type Closure<V>, the V represents the return value of the closure, not its parameters. As such, it wouldn't make sense to have a Closure<V, X> since you can't return two values. –  Nancy Deschênes Jul 26 '13 at 1:16
I mean Closure<X,Y> to accept a single X as input and returns Y. So it can be applied to the items of List<X>. I updated the return type of the function. –  Adam Schmideg Jul 26 '13 at 8:57
add comment

1 Answer

up vote 3 down vote accepted

You can define the types of a closure's parameters, but the syntax shown above is incorrect. Here is a closure without parameter types:

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

And here is the same closure with parameter types

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


Groovy does do some compile-time type checking, but not as much as Groovy++ (or Java). Even if the type information is not used at compile-time it will be checked at runtime, and is also valuable as a form of documentation.

share|improve this answer
please, see my update. Of what type is your concatenate? Is it Closure<String,String,String>? Or what? –  Adam Schmideg Apr 18 '11 at 17:07
I accept this answer not because I'm happy with it, but this is the only one :( Maybe, my question wasn't clear enough. –  Adam Schmideg Jul 22 '11 at 10:35
add comment

Your Answer


