157

I have a third party Java library which an object with interface like this:

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

How can I concisely implement it in Kotlin similar to Java anonymous class like this:

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"

5 Answers 5

212

Assuming the interface has only a single method you can make use of SAM.

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

Since version 1.4 Kotlin supports SAM for interfaces defined in Kotlin. That requires prefixing the interface keyword with fun

fun interface Handler<C> {
  fun call(context: C);
}

If you have a method that accepts a handler then you can even omit type arguments:

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

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

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

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

If the interface has more than one method the syntax is a bit more verbose:

val handler = object: Handler2<String> {
    override fun call(context: String?) { println("Call: $context") }
    override fun run(context: String?) { println("Run: $context")  }
}
Sign up to request clarification or add additional context in comments.

4 Comments

acceptHandler { println("Hello: $it")} would also work in most cases
For anyone struggling . i think the interface must be declared in java. i think SAM conversion not working for kotlin interfaces. if its a kotlin interface you have to use the object:Handler{} way. per here: youtrack.jetbrains.com/issue/KT-7770 .
You can do this with a Kotlin interface as of 1.4 - you just declare it as a fun interface.
@Nick I'd recommend adding that as a separate answer, or editing it into this answer
39

I had a case where I did not want to create a var for it but do it inline. The way I achieved it is

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

                        override fun OnMethod2() {}
})

Comments

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

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

1 Comment

yes if interface is not SAM(Single Abstract Method) this code will works
3

As of Kotlin 1.4 you can declare a functional interface:

fun interface Handler<C> {
  fun call(context: C);
}

and then you can create one concisely:

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

Demo

Comments

2

The simplest answer probably is the Kotlin's lambda:

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

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.