2016-12-26 89 views
0

我科特林接口:科特林anonim类实现接口

interface IRunnable<T> { 
    fun doWork(): T 
} 

然后我创建匿名类来实现我的接口:

executor!!.execute(object : IRunnable<Long> { 
    override fun doWork(): Long { 
     return 0L 
    } 
}) 

如果Java接口,代码看起来象

executor!!.execute(IRunnable2 { [email protected] 0L }) 

任何想法,如何在Java中实现kotlin接口?

+2

如果您在Java中创建一个接口*和*有一个方法*您可以使用快捷键在Kotlin。而已。 https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions如果你在Kotlin中定义了一个接口*,你必须扩展接口。最简单的方法是在Java中定义接口并继续。 –

回答

1

请不要用IRunnable这样的命名在kotlin中。

正如在这个问题How kotlin makes setOnClickListener accept functions as parameter描述的那样,Kotlin仅为Java接口做SAM。但是,你可以赞成功能型的改变接口,或实现接口,并把它作为在下面的例子:

fun main(args: Array<String>) { 
    class Executor { 
     fun <T> execute(task: SimpleRunnable<T>): CompletableFuture<T> { 
      return CompletableFuture.supplyAsync { 
       task.doWork() 
      } 
     } 
    } 

    val executor = Executor() 

    executor.execute(SimpleRunnableImpl { "42" }) 

    executor.execute(object : SimpleRunnable<Long> { 
     override fun doWork(): Long { 
      return 0L 
     } 
    }) 
} 

interface SimpleRunnable<T> { 
    fun doWork(): T 
} 

class SimpleRunnableImpl<T>(val task:() -> T) : SimpleRunnable<T> { 
    override fun doWork(): T = task() 
}