2017-06-02 129 views
2

看,我有一个Java类:为什么我不能使用lambda作为kotlin的接口?

public final class JavaReceiveSingle { 
    public static void useSingle(Single single) { 
     single.doSth(); 
    } 
    public static void useSingle2(SingleInterface singleInterface) { 
     singleInterface.doSth(); 
    } 
} 

的Java接口:

public interface SingleInterface { 
    void doSth(); 
} 

一个科特林接口:

interface Single { 
    fun doSth() 
} 

现在我可以在科特林类像使用拉姆达:

JavaReceiveSingle.useSingle2({}) 

但是,如果我想要做同样的事情科特林接口:

JavaReceiveSingle.useSingle({}) 

IDE会显示错误:要求:单!发现:() - >单位

,如果我指定单,如:

JavaReceiveSingle.useSingle(Single{}) 

还是错误:接口单没有结构!

虽然下面的代码工作:

JavaReceiveSingle.useSingle(object :Single{ 
    override fun aa() {} 
}) 

但为什么我不能为科特林接口使用拉姆达?

+0

Kotlin具有功能类型, G。 '() - > Unit'是一个不接受参数并返回Unit(无值)的函数。这样,就不需要功能接口和SAM转换。 –

+0

那么在这种情况下,推荐使用函数类型来取代传统的内部匿名类?如果是这样,那么我明白了 – user2699165

回答

1

目前,在Kotlin中定义的接口不支持SAM conversion。在YouTrack有一个问题,但目前我建议使用功能类型而不是单一方法的接口。如果你想让他们有一个合适的名字,你可以使用type aliases,但不要过度使用它们。在许多情况下,功能类型和好的方法/变量名称足以表达出来。

相关问题