首页 > 解决方案 > Kotlin - 自动匹配覆盖的函数类型?

问题描述

我正在尝试编写一个函数,该函数本质上是围绕其他一些功能的包装方法,例如,一些日志记录函数。

我尝试了 , , 等的几种组合inlinegenericreified似乎没有任何效果。

我的功能如下所示:

fun log(note: String, block: () -> Unit): () -> Unit {
    print(note)
    return block
}

我的想法是对传入的执行一些简单的操作note,然后将传入的函数返回原样使用。

但是,我想围绕这样的覆盖函数执行此操作:

override fun onClick(clicked: View) = log("Green Button") {
    // here the regular onClick functionality goes
}

在这里,我收到一个错误“返回类型是 () -> 单元,它不是被覆盖的子类型”。这很有意义,因为函数签名不匹配。

但是,当我使用其他随机函数执行此操作时:

fun test() = log("foo") { ... }
fun otherTest(a: String, b: Int) = log("bar") { ... }

我没有收到任何错误,而解释器似乎对此很好。我也尝试过GlobalScope.launch采用这种方法,但我无法弄清楚。

我正在尝试做的事情可能吗?如果没有,有什么接近的吗?

标签: kotlin

解决方案


我认为

inline fun log(note: String, block: () -> Unit): Unit {
    print(note)
    return block()
}

应该做你想做的。可以概括为

inline fun <T> log(note: String, block: () -> T): T {
    print(note)
    return block()
}

我没有收到任何错误,而解释器似乎对此很好。

为什么这令人惊讶?这些函数只是 return () -> Unit。如果你这样做

fun test() = log("foo") { print("bar") }

然后调用test()不会打印bar;呼唤test()()意志。


推荐阅读