2016-06-07 21 views
13

Ich habe eine dritte Partei Java-Bibliothek, die ein Objekt mit Interface wie folgt aus:Wie erstelle ich eine Instanz einer anonymen Schnittstelle in Kotlin?

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

Wie kann ich es ähnlich in Kotlin prägnant implementieren, um Java anonyme Klasse wie folgt aus: Antwort

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" 

Antwort

22

die Schnittstelle Unter der Annahme hat nur eine einzige Methode, die Sie Gebrauch vonmachen

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

Wenn Sie eine Methode, die eine Prozedur akzeptiert, dann können Sie auch Typ Argumente weglassen:

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

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

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

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

Wenn die Schnittstelle mehr als eine Methode hat die Syntax ist ein wenig ausführlicher:

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

'acceptHandler {println (" Hallo: $ it ")}' würde auch in den meisten Fällen funktionieren – voddan

2

Die einfachste wahrscheinlich ist das Lambda des Kotlin:

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

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