kotlin - Kotlin - 自动匹配覆盖的函数类型?
问题描述
我正在尝试编写一个函数,该函数本质上是围绕其他一些功能的包装方法,例如,一些日志记录函数。
我尝试了 , , 等的几种组合inline
,generic
但reified
似乎没有任何效果。
我的功能如下所示:
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
采用这种方法,但我无法弄清楚。
我正在尝试做的事情可能吗?如果没有,有什么接近的吗?
解决方案
我认为
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()()
意志。
推荐阅读
- python - Django Rest Framework - 每次创建新模型 A 实例时自动创建新模型 B 实例
- javascript - VanillaJS - 单击按钮时更改具有相同类的特定按钮的样式
- reactjs - 如何使用 Graphql 以正确的方式获得结果
- c# - 我想添加由 Field Asana Api 创建的故事(评论)
- r - 如何(有效地)从访问过的地方列表中构建边缘列表?
- ios - 单击段控制表单元格内的按钮时无法执行 segue
- javascript - 柱形图水平刻度的透明背景
- apache-flink - 共享的检查点非常大
- jquery - Jquery - 多个下拉列表,禁用其他列表中的选定条目
- python - 如何使用 python 访问演示文稿的形状或文本运行中存在的 url?