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

0 ответов

Другие вопросы по тегам