kotlin语法--->fun interface 函数式接口(使kotlin符合SAM转换)

  1. 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来进行简写的,我觉得编辑器应该报错啊。

    kotlin语法--->fun interface 函数式接口(使kotlin符合SAM转换)
    图1

    但是图2并没有报错。

    kotlin语法--->fun interface 函数式接口(使kotlin符合SAM转换)
    图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转换)

上一篇:FreeRtos——移植


下一篇:UVa11555 - Aspen Avenue