kotlin语法--->fun interface 函数式接口(使kotlin也符合SAM(single abstract method)转换)
问题出处Compose中的layout函数,在进行自定义layout时,它的第三个参数也可以使用尾随的lambda语法来写,当时感觉比较疑惑.因为kotlin在调用java中的函数式接口是可以使用lambda语法来简写的。
但是kotlin调用自身的”函数式接口“时会出现编译时错误。下面是一个例子.
fun setMyListener(listener: MyListener) {
listener.onCheckdChange("name","zyt")
}
interface MyListener {
fun onCheckedChanged(param1: String, param2: String)
}
fun mian(){
// 当我们通过SAM转译调用时,会出现错误
setMyListener { a, b ->
print("param1:$a,param2:$b") // Compile time error
}
}
在我们调用java中的函数式接口时,kotlin是可以使用lambda来进行简写的。如下
// Test.java
public interface Test {
void onChanged();
}
//.kt
fun main(){
setTest{ // 这里并不会出现问题
println("onChanged")
}
}
fun setTest(test: Test) {
test.onChanged()
}
可以理解为kotlin兼容java的SAM转换.但是也有解决办法,如下。
解决方法1:类似于java中的匿名内部类
setMyListener(object : MyListener{
override fun onCheckdChange(param1: String, param2: String) {
TODO("Not yet implemented")
}
})
解决方法2:先看一下我当时遇到的疑惑,如下图1。因为根据我前面的知识来理解,是不可使用尾随lambda来进行简写的,我觉得编辑器应该报错啊。
图1
但是图2并没有报错。
图2
我接着点进MeasurePolicy进入看,一开始没有注意到interface前有一个fun修饰符,
// MeasurePolicy.kt
@Stable
fun interface MeasurePolicy {
// 就这一个抽象方法(没有函数体)
fun MeasureScope.measure(
measurables: List<Measurable>,
constraints: Constraints
): MeasureResult
。。。。。。
}
接下来我试了一下,如下
fun setMyListener(listener: MyListener) {
listener.onCheckdChange("name","zyt")
}
fun interface MyListener { // fun interface 我的理解就是函数式接口,这里必须包含一个抽象方法(也就是没有函数体),没有抽象方法编译不通过
fun onCheckdChange(param1: String, param2: String)
}
// 那么接下来就可以使用lambda来进行调用了(kotlin自身也符合SAM转换了)
setMyListener { a, b ->
println("param1:$a,param2:$b")
}
kotlin语法--->fun interface 函数式接口(使kotlin符合SAM转换)
原文:https://www.cnblogs.com/sowhappy/p/15153944.html