代码之家  ›  专栏  ›  技术社区  ›  mhulse

Kotlin:委托重写函数如何使用lambda和函数parens

  •  0
  • mhulse  · 技术社区  · 3 年前

    我正试图覆盖 error() 的方法 kotlin-logging .

    下面的代码接近我想要的,但我不明白一些事情(我是Kotlin的新手)。

    示例代码:

    import mu.KLogger
    import mu.KotlinLogging
    
    open class BgrLogging(
        private val delegate: KLogger
    ) : KLogger by delegate {
        override fun error(msg: () -> Any?) {
            delegate.error("$msg xxxx")
        }
    }
    
    fun KLogger.toBgrLogging() = BgrLogging(this)
    
    private val logger = KotlinLogging.logger {}.toBgrLogging()
    

    我希望能够调用我的overrided 错误 方法是这样的:

    logger.error("should override error")
    // Output: should override error
    

    不幸的是,这似乎跳过了我的覆盖并调用了原始 错误 在里面 科特林测井 .

    如果我使用lambda:

    logger.error{ "should override error" }
    // Output: () -> kotlin.Any? xxxx
    

    它调用了我的覆盖(耶!),但输出不是我想要的。

    观察

    当我打电话时 科特林测井 直接(没有覆盖),这两种方法似乎都如我所期望的那样起作用:

    logger.error("foo1")
    logger.error{ "foo1" }
    

    它在传递字符串时输出字符串。

    问题

    两者都有可能吗 logger.error("xxxx") logger.error{ "xxxx" } 调用我的重写函数?我希望两个调用都输出实际的字符串,而不是 () -> kotlin.Any? .

    Java 17
    Kotlin Compiler Version: 1.6.10
    kotlin-logging 1.5.4
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   Marcus Dunn    3 年前
    logger.error("should override error")
    

    不调用被覆盖的 error 因为它有签名 (String) -> Unit 而您只使用签名覆盖错误 (() -> Any?) -> Unit 在Kotlin的模型中,重载函数是完全独立的。

    如果要覆盖 错误 当对字符串调用时,您还必须重写该方法。