【问题标题】:Pass interface as parameter in Kotlin在 Kotlin 中将接口作为参数传递
【发布时间】:2017-05-29 16:57:16
【问题描述】:

我想像这样传递一个接口作为参数:

class Test {
    fun main() {
        test({})
        // how can I pass here?
    }

    fun test(handler: Handler) {
        // do something
    }

    interface Handler {
        fun onCompleted()
    }
}

在 Java 中,我可以使用像 test(new Handler() { .......... }) 这样的匿名函数,但在 Kotlin 中我不能这样做。有人知道怎么做吗?

【问题讨论】:

    标签: android lambda interface kotlin


    【解决方案1】:

    在 Kotlin 你可以这样做:

    test(object: Handler {
        override fun onComplete() {
    
        }
    })
    

    或者以同样的方式创建一个属性:

    val handler = object: Handler {
        override fun onComplete() {
    
        }
    }
    

    而且,在代码中的某处: 测试(处理程序)

    【讨论】:

    • 您可以将函数标记为:fun test(handler: () -> Unit)(或 Unit 以外,如果您想返回某些东西)
    • 如何使用 lambda 实现回调功能 (Java)。我希望在不同的类中实现并在不同的类中调用它
    【解决方案2】:

    因为你的界面只有一个功能。您可以像这样将其转换为 SAM

    fun interface Handler {
            fun onCompleted()
    }
    
    

    那么您可以只使用 lambda 来实现此接口,从而减少整体编写代码。这只能在 v1.4 中实现

    【讨论】:

    • 谢谢,这正是我想要的
    【解决方案3】:

    附件是一个示例,说明如何通过表示数据类型值的参数传递对象并使用接口继承调用行为。

    fun main() {
    
        val customClass = CustomClass(
                object : First {
                    override fun first() {
                        super.first()
                        println("first new impl")
                    }
                    override fun second() {
                        super.second()
                        println("second new impl")
                    }
                }
        )
    
        customClass.first.first()
        customClass.first.second()
    
    }
    
    data class CustomClass(val first: First)
    
    interface First: Second {
        fun first() {
            println("first default impl")
        }
    }
    
    
    interface Second {
        fun second() {
            println("second default impl")
        }
    }
    

    值得一提的是,super.first()super.second() 会调用接口的默认行为。

    如果我们需要调用函数,那么传递带有匿名对象的 lamda 作为参数 lambda: () -> Unit 没有多大意义。

    GL

    Playground

    【讨论】:

    • 这如何回答这个问题?
    • @SarpBaşaraner 我的回答就像投射到一个界面,所以对于这个问题没有多大意义。我已经更新了我的答案。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2011-12-04
    • 2011-02-21
    • 2020-12-20
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多