为什么我不能在kotlin上使用lambda作为接口?

use*_*165 5 lambda kotlin

看,我有一个Java类:

public final class JavaReceiveSingle {
    public static void useSingle(Single single) {
        single.doSth();
    }
    public static void useSingle2(SingleInterface singleInterface) {
        singleInterface.doSth();
    }
}
Run Code Online (Sandbox Code Playgroud)

Java接口:

public interface SingleInterface {
    void doSth();
}
Run Code Online (Sandbox Code Playgroud)

Kotlin界面:

interface Single {
    fun doSth()
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以在类似kotlin的类中使用lambda:

JavaReceiveSingle.useSingle2({})
Run Code Online (Sandbox Code Playgroud)

但是,如果我想对kotlin界面做同样的事情:

JavaReceiveSingle.useSingle({})
Run Code Online (Sandbox Code Playgroud)

IDE将显示错误:必需:单!找到:()->单位

如果我指定Single,例如:

JavaReceiveSingle.useSingle(Single{})
Run Code Online (Sandbox Code Playgroud)

仍然错误:Interface Single没有构造!

尽管以下代码可以工作:

JavaReceiveSingle.useSingle(object :Single{
    override fun aa() {}
})
Run Code Online (Sandbox Code Playgroud)

但是为什么我不能将lambda用于kotlin接口呢?

Chr*_*ann 2

目前,Kotlin 中定义的接口不支持SAM 转换。YouTrack中存在一个问题,但目前我建议使用函数类型而不是单一方法接口。如果您希望它们有一个正确的名称,您可以使用类型别名,但不要过度使用它们。在许多情况下,函数类型与良好的方法/变量名称一起就足以表达。