java - 如何在 Kotlin 中创建匿名接口(interface)的实例?

标签 java lambda kotlin anonymous

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

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"

最佳答案

假设接口(interface)只有一个方法可以使用SAM .

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

从 1.4 版开始,Kotlin 支持 SAM 用于 Kotlin 中定义的接口(interface)。这需要在 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") }

如果接口(interface)有多个方法,则语法有点冗长:

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

关于java - 如何在 Kotlin 中创建匿名接口(interface)的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37672023/

相关文章:

java - 从java中排序的ArrayList中的特定字符串开始搜索字符串列表

java - (JAVA) 如何在浏览器中打开临时 htm 文件?

java - 包装 jar 的 OSGi 服务

kotlin - 对于强制相同类型的 2 个参数的通用类型 T 有什么方法吗?

android - 如何设置Kotlin中的Toast的重力(属性样式)(出现错误)?

java - 如何使用 IJavaElement

python - 为什么在使用这个 lambda 函数时 .issubset(x) 中应该有一个 x?

c# - LINQ - EF 的多个函数参数

c++ - Lambda 返回引用会导致段错误 - 为什么?

apache-spark - collectAsList 后为空集,即使它在转换运算符中不为空