2016-06-07 111 views
13

我有一个第三方Java库与接口的对象是这样的:如何在Kotlin中创建匿名接口的实例?

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

我怎样才能简洁实现它在科特林类似于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" 

回答

22

假设接口只有一个方法,你可以利用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") } 
} 
+1

'acceptHandler {println(“Hello:$ it”)}'在大多数情况下也可以使用 – voddan

2

最简单的答案大概是科特林的lambda:

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

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