2016-06-07 4 views
13

У меня есть третья партия Java библиотеку, в которой объект с интерфейсом, как это:Как создать экземпляр анонимного интерфейса в Котлине?

public interface Handler<C> { 
    void call(C context) throws Exception; 
} 

Как я могу кратко реализовать его в Котлин похож на Java анонимного класса, как это:

Handler<MyContext> handler = new Handler<MyContext> { 
    @Override 
    public void call(MyContext context) throws Exception { 
     System.out.println("Hello world"); 
    } 
} 

handler.call(myContext) // Prints "Hello world" 

ответ

22

Предполагая, что интерфейс имеет только один метод, который вы можете использовать SAM

val handler = Handler<String> { println("Hello: $it")} 

Если у вас есть метод, который принимает обработчик, то вы можете даже не указывать аргументы типа:

fun acceptHandler(handler:Handler<String>){} 

acceptHandler(Handler { println("Hello: $it")}) 

acceptHandler({ println("Hello: $it")}) 

acceptHandler { println("Hello: $it")} 

Если интерфейс имеет более одного метода синтаксис является немного более многословен:

val handler = object: Handler2<String> { 
    override fun call(context: String?) { println("Call: $context") } 
    override fun run(context: String?) { println("Run: $context") } 
} 
+1

'acceptHandler {println (" Hello: $ it ")}' также будет работать в большинстве случаев – voddan

2

Самый простой ответ вероятно, является лямбда котлинского в:

val handler = Handler<MyContext> { 
    println("Hello world") 
} 

handler.call(myContext) // Prints "Hello world" 
Смежные вопросы