2016-12-26 85 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() 
}