在 Kotlin 中将接口作为参数传递

Posted

技术标签:

【中文标题】在 Kotlin 中将接口作为参数传递【英文标题】:Pass interface as parameter in 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 中我不能这样做。有人知道怎么做吗?

【问题讨论】:

【参考方案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 我的回答就像投射到一个界面,所以对于这个问题没有多大意义。我已经更新了我的答案。谢谢

以上是关于在 Kotlin 中将接口作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

在 Kotlin Android 中将值传递给函数时进行编译时间检查

kotlin lambda 表达式作为可选参数

为什么在Kotlin中将变量传递给lambda有效?

Kotlin - 通过 Intent 将函数作为参数传递

在 Postman 中将类对象作为参数传递

是否可以在c中将函数作为参数传递? [复制]