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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.