-
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") }