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

时间:2017-01-14 11:38:29

标签: android lambda interface kotlin

我想将接口作为参数传递:

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中执行此操作。有谁知道怎么做?

3 个答案:

答案 0 :(得分:44)

在Kotlin你可以这样做:

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

    }
})

或者以相同的方式制作一个属性:

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

    }
}

而且,代码中的某个地方:     试验(处理程序)

答案 1 :(得分:3)

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

fun interface Handler {
        fun onCompleted()
}

然后你可以使用 lambda 来实现这个接口,从而减少整体编写的代码。这只能在 v1.4 中实现

答案 2 :(得分:-1)

附加的示例是如何通过代表数据类型值的参数传递对象并使用接口继承调用行为的示例。

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()时,将调用接口的默认行为。

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

GL

Playground