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
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
}
I know that Groovy won't use that type information, but Groovy++ may use it at compile time.
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.
I presume you aren't using Groovy++ anymore, but even if you are this may work. It certainly works for statically typed Groovy 2.x
interface Z {
void callback(X x, Y y)
}
List<Y> myCollect(List<X> list, Z clos) {
...
clos.callback(x, y)
}
the caller then calls it with the normal:
List<Y> object.myConnect(list) { X x, Y y ->
}
If you leave a parameter out and have @CompileStatic, the compiler picks up missing params or bad types.
This works because a 1 method interface is equivalent to a closure in Groovy.
For anyone still looking for the answer: have a look at @ClosureParams
, which provides IDE hints as to the expected closure parameter types
精彩评论