Kotlin anonim类实现接口

时间:2016-12-26 17:57:48

标签: kotlin

我的kotlin界面:

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

然后我创建了一个实现我的界面的匿名类:

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

如果java中的接口,代码看起来像

 executor!!.execute(IRunnable2 { return@IRunnable2 0L })

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

1 个答案:

答案 0 :(得分:2)

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

正如在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()
}