在 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 中将接口作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章