Come creare un'istanza di interfaccia anonima in Kotlin?


95

Ho una libreria Java di terze parti che un oggetto con un'interfaccia come questa:

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

Come posso implementarlo in modo conciso in Kotlin simile alla classe anonima Java come questa:

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"

Risposte:


143

Supponendo che l'interfaccia abbia un solo metodo, puoi utilizzare SAM

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

Se hai un metodo che accetta un gestore, puoi anche omettere gli 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ù dettagliata:

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

2
acceptHandler { println("Hello: $it")}funzionerebbe anche nella maggior parte dei casi
voddan

5
Per chiunque abbia difficoltà. penso che l'interfaccia debba essere dichiarata in java. Penso che la conversione SAM non funzioni per le interfacce kotlin. se è un'interfaccia kotlin devi usare l'oggetto: Handler {} way. per qui: youtrack.jetbrains.com/issue/KT-7770 .
j2emanue

2
Puoi farlo con un'interfaccia Kotlin a partire dalla 1.4 - devi solo dichiararlo come file fun interface.
Nick

18

Ho avuto un caso in cui non volevo creare una var per esso ma farlo in linea. Il modo in cui l'ho raggiunto è

funA(object: InterfaceListener {
                        override fun OnMethod1() {}

                        override fun OnMethod2() {}
})

14
     val obj = object : MyInterface {
         override fun function1(arg:Int) { ... }

         override fun function12(arg:Int,arg:Int) { ... }
     }

2

La risposta più semplice probabilmente è il lambda di Kotlin:

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

handler.call(myContext) // Prints "Hello world"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.