2016-06-07 20 views
13

Ho una libreria Java di terze parti, che un oggetto con un'interfaccia simile a questo:Come creare un'istanza di interfaccia anonima in Kotlin?

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

Come posso conciso recepirlo nel Kotlin simile a Java classe anonima in questo modo:

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" 

risposta

22

Supponendo che l'interfaccia è solo un singolo metodo si può fare uso di SAM

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

Se si dispone di un metodo che accetta un gestore, allora si può anche omettere argomenti di tipo:

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

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

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

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

Se l'interfaccia ha più di un metodo La sintassi è un po 'più dettagliato:

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 ")}' potrebbe funzionare anche nella maggior parte dei casi – voddan

2

La risposta più semplice probabilmente è lambda del Kotlin:

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

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