Kotlin: делегировать функцию переопределения, как заставить работать с лямбда-выражением и парными функциями
Я пытаюсь переопределить метод .
Следующий код близок к тому, что я хочу, но я не понимаю нескольких вещей (я новичок в 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()
Я хотел бы иметь возможность вызывать свой переопределенный метод следующим образом:
logger.error("should override error")
// Output: should override error
… к сожалению, это, кажется, пропускает мое переопределение и вызывает оригиналerror()
в .
Если я использую лямбду:
logger.error{ "should override error" }
// Output: () -> kotlin.Any? xxxx
Он вызывает мое переопределение (ура!), но результат не тот, что я хочу.
Наблюдение
Когда я звонюkotlin-logging
напрямую (без переопределения), оба они, похоже, работают так, как я и ожидал:
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