Интересный вопрос ... Короткого ответа нет.Длинный ответ, может быть ... Если предположить, что у вас есть что-то вроде этого:
def i = 1
Iterator iter = [ hasNext:{ true }, next:{ i++ } ] as Iterator
, затем звоните
println iter.take( 3 ).collect()
печатает [1,2,3]
Теперь вы можете объявитьметод для этого:
def mapFromInterface( Object o, Class... clz ) {
// Get a Set of all methods across the array of classes clz
Set methods = clz*.methods.flatten()
// Then, for each of these
methods.collectEntries {
// create a map entry with the name of the method as the key
// and a closure which invokes the method as a value
[ (it.name): { Object... args ->
o.metaClass.pickMethod( it.name, it.parameterTypes ).invoke( o, args )
} ]
}
}
Затем вы можете сделать:
def map = mapFromInterface( iter, Iterator )
И вызов:
println map.next()
println map.next()
Напечатает 4
, а затем 5
печать карты с помощью println map
дает:
[ remove:ConsoleScript43$_mapFromInterface_closure3_closure4@57752bea,
hasNext:ConsoleScript43$_mapFromInterface_closure3_closure4@4d963c81,
next:ConsoleScript43$_mapFromInterface_closure3_closure4@425e60f2 ]
Однако , поскольку это карта, любой класс, который содержит несколько методов с одинаковым именеми разные аргументы потерпят неудачу.Я также не уверен, насколько разумно делать это в первом случае ...
Чем интересен ваш вариант использования?