首页 文章

如何在Kotlin中创建匿名接口的实例?

提问于
浏览
51

我有一个第三方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"

3 回答

  • 2

    假设界面只有一个方法,你可以使用SAM

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

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

    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")  }
    }
    
  • 76

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

    val handler = Handler<MyContext> {
      println("Hello world")
    }
    
    handler.call(myContext) // Prints "Hello world"
    
  • 2

    我有一个案例,我不想为它创建一个var,但它是内联的 . 我实现它的方式是

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

相关问题