为什么我不能使用lambda作为kotlin的接口?
问题描述:
看,我有一个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() {}
})
但为什么我不能为科特林接口使用拉姆达?
答
目前,在Kotlin中定义的接口不支持SAM conversion。在YouTrack有一个问题,但目前我建议使用功能类型而不是单一方法的接口。如果你想让他们有一个合适的名字,你可以使用type aliases,但不要过度使用它们。在许多情况下,功能类型和好的方法/变量名称足以表达出来。
Kotlin具有功能类型, G。 '() - > Unit'是一个不接受参数并返回Unit(无值)的函数。这样,就不需要功能接口和SAM转换。 –
那么在这种情况下,推荐使用函数类型来取代传统的内部匿名类?如果是这样,那么我明白了 – user2699165