2016-12-24 6 views
1

Есть ли способ передать интерфейсы как параметры varargs для метода в groovy?Как передать интерфейсы в качестве параметров varargs для метода в Groovy?

Вот что я пытаюсь сделать:

interface Handler { 
    void handle(String) 
} 

def foo(Handler... handlers) { 
    handlers.each { it.handle('Hello!') } 
} 

foo({ print(it) }, { print(it.toUpperCase()) }) 

Когда я запускаю следующий код, я получаю ошибку: No signature of method: ConsoleScript8.foo() is applicable for argument types: (ConsoleScript8$_run_closure1, ConsoleScript8$_run_closure2) values: [[email protected], [email protected]]

Что мне нужно изменить?

ответ

5

Java-стиль ... -varargs - это только Handler[] для JVM. Таким образом, кратчайший путь, чтобы сделать эту работу является:

foo([{ print(it) }, { print(it.toUpperCase()) }] as Handler[]) 

(Передайте их в список броска к Handler[])

+0

Ницца! Upvoted! :) – Opal

+0

@ Опал только с одним обработчиком, ваше решение короче - так что он отдал пользу;) – cfrick

+0

@cfrick Это кажется достаточно элегантным. Спасибо! – kshep92

3

Таким образом:

interface Handler { 
    void handle(String) 
} 

def foo(Handler... handlers) { 
    handlers.each { it.handle('Hello!') } 
} 

foo({ print(it) } as Handler, { print(it.toUpperCase()) } as Handler) 

Вам нужно сделать отливку.

+1

Принято предыдущий ответ, потому что он выглядел более элегантно, но ваше решение дает мне код помощь для 'него 'в IntelliJ, так что имейте upvote. – kshep92

 Смежные вопросы

  • Нет связанных вопросов^_^