如何在 Kotlin 创建一个匿名接口实例?

我有一个第三方 Java 库,其中一个对象的接口如下:

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

如何在 Kotlin 简洁地实现它,就像 Java 匿名类一样:

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"
77420 次浏览

最简单的答案可能是 Kotlin 的 lambda:

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


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

假设接口只有一个方法,您可以使用 SAM

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

由于版本1.4,Kotlin 支持在 Kotlin 定义的接口使用 SAM,这需要在 interface关键字前面加上 fun

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

如果您有一个接受处理程序的方法,那么您甚至可以省略类型参数:

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


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


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


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

如果接口有多个方法,语法就有点冗长:

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

我有一个案例,我不想为它创建一个变量,但它在内联。我实现它的方式是

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


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


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

从 Kotlin 1.4开始,你可以声明一个功能界面:

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

然后你可以简洁地创建一个:

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

演示