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中調(diào)用Sam接口
public class JavaCallbackCall {
public void call(Callback callback) {
callback.callback("", 0);
}
}
Kotlin方法參數(shù)是Java的Sam接口
fun kotlinCallSam(callback: Callback) {
callback.callback("", 0)
}
具體的調(diào)用
fun main(args: Array<String>) {
javaCall()
kotlinCall()
}
fun kotlinCall() {
//一開始我們會這樣寫,傳遞一個對象
kotlinCallSam(object : Callback {
override fun callback(a: String?, b: Int) {}
})
//IDEA提示我們優(yōu)化
kotlinCallSam(Callback { a, b -> })
//因為參數(shù)沒有用到窟感,所以用_代替
kotlinCallSam(Callback { _, _ -> })
}
fun javaCall() {
//一開始我們會這樣寫讨彼,傳遞一個對象
JavaCallbackCall.call(object : Callback {
override fun callback(a: String?, b: Int) { }
})
//IDEA提示我們優(yōu)化
JavaCallbackCall.call { a, b ->}
//因為參數(shù)沒有用到,所以用_代替
JavaCallbackCall.call { _, _ -> }
}
Kotlin接口是不支持Sam的
SamKotlinInterface.kt
interface SamKotlinInterface {
fun callback(a: String, b: Int)
}
調(diào)用
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轉(zhuǎn)換只適合接口柿祈,并不能適用于抽象類
2.Kotlin接口不支持Sam哈误,因為Kotlin有更優(yōu)秀的高階函數(shù)
參考
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