【问题标题】:Extending Kotlin's extension扩展 Kotlin 的扩展
【发布时间】:2020-09-10 12:11:21
【问题描述】:

我正在尝试为 KLogger/Logger 创建一个扩展,它是 slf4j 记录器的扩展,以便更好地处理结构化日志消息。有人可以解释我的代码有什么问题以及如何在不传递我的记录器对象的情况下修复它或解决它吗?我的扩展永远不会被调用。

下面你可能会看到极简的 build.gradle + sn-p 代码:

App.kt:

import mu.KLogger
import mu.KotlinLogging

private val log = KotlinLogging.logger {}

fun main() {
    log.info("log message",
            "key1" to "value1",
            "key2" to "value2"
    )
}

fun KLogger.info(message: String, vararg keyValues: Pair<String, Any?>) {
    log.info("log extension")
    info(message)
}

build.gradle.kts:

plugins {
    kotlin("jvm") version "1.3.72"
}

group = "rg"
version = "1.0"
java.sourceCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("ch.qos.logback:logback-classic:1.2.3")
    implementation("io.github.microutils:kotlin-logging:1.7.6")
}

更新: 我最终放弃了扩展想法并将现有代码转换为委托。

fun structuredLogger(func: () -> Unit): StructuredLogger = StructuredLogger(func)

class StructuredLogger(func: () -> Unit, private val log: KLogger = KotlinLogging.logger(func)) : KLogger by log {

    fun info(msg: String?, vararg keyValues: Pair<LoggingKey, Any?>) {
        log.info(marker(*keyValues), msg)
    }

    // (...)
}

【问题讨论】:

  • KLogger 是否有具有完全相同签名的实例方法?在这种情况下,扩展程序将不起作用。
  • Logger 有这些:public void info(String format, Object arg1, Object arg2); public void info(String format, Object... arguments);

标签: kotlin logging kotlin-extension


【解决方案1】:

Logger 有一个签名为 info(message: String, vararg arguments: Any) 的函数(转换为 Kotlin)。尽管 yourvararg 用于 Pairs,但这只是 Any 的模棱两可的重载。扩展函数不能覆盖非扩展函数,如果它们覆盖,它们将被简单地忽略。您将不得不更改您的函数名称或参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多