A SAM is an interface with a Single Abstract Method
Sam是Java 8 支持Lambda语法的一种方式。Kotlin是号称100%兼容Java的,自然也就兼容Java 8 的Sam接口。
举例说明
Callback.java:Java的Sam接口
public interface Callback {
void callback(String a, int b);
}
JavaCallbackCall.java Java中调用Sam接口
public class JavaCallbackCall {
public void call(Callback callback) {
callback.callback("", 0);
}
}
Kotlin方法参数是Java的Sam接口
fun kotlinCallSam(callback: Callback) {
callback.callback("", 0)
}
具体的调用
fun main(args: Array<String>) {
javaCall()
kotlinCall()
}
fun kotlinCall() {
//一开始我们会这样写,传递一个对象
kotlinCallSam(object : Callback {
override fun callback(a: String?, b: Int) {}
})
//IDEA提示我们优化
kotlinCallSam(Callback { a, b -> })
//因为参数没有用到,所以用_代替
kotlinCallSam(Callback { _, _ -> })
}
fun javaCall() {
//一开始我们会这样写,传递一个对象
JavaCallbackCall.call(object : Callback {
override fun callback(a: String?, b: Int) { }
})
//IDEA提示我们优化
JavaCallbackCall.call { a, b ->}
//因为参数没有用到,所以用_代替
JavaCallbackCall.call { _, _ -> }
}
Kotlin接口是不支持Sam的
SamKotlinInterface.kt
interface SamKotlinInterface {
fun callback(a: String, b: Int)
}
调用
fun callKotlinSamInterface(samKotlinInterface: SamKotlinInterface) {
samKotlinInterface.callback("", 0)
}
fun main(args: Array<String>) {
//正确的用法
callKotlinSamInterface(object : SamKotlinInterface {
override fun callback(a: String, b: Int) {
}
})
//错误的用法
callKotlinSamInterface(SamKotlinInterface { a, b -> })
}
Note
1.SAM转换只适合接口,并不能适用于抽象类
2.Kotlin接口不支持Sam,因为Kotlin有更优秀的高阶函数
参考
1.https://stackoverflow.com/questions/44562745/how-to-implements-a-java-sam-interface-in-kotlin
2.https://discuss.kotlinlang.org/t/kotlin-and-sam-interface-with-two-parameters/293
3.https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions