Как расширить dataclass с помощью toString

Я создал dataclass

data class Something (
    val a : String,
    val b : Object,
    val c : String
)

как позже в моей программе мне нужно строковое представление этого dataclass, я попытался расширить метод toString.

override fun Something.toString() : String = a + b.result() + c

Проблема заключается в том, что она не позволяет расширить (переопределить) функцию toString, поскольку она не применима к функциям верхнего уровня.

Как правильно переопределить/расширить метод toString пользовательского dataclass?

Ответ 1

В Kotlin функции расширения не могут переопределять функции-члены, более того, они разрешены статически. Это означает, что если вы пишете функцию расширения fun Something.toString() = ..., s.toString() не будет разрешена к ней, потому что член всегда выигрывает.

Но в вашем случае ничто не мешает вам переопределить toString внутри тела Something, потому что классы data могут иметь тела, подобные обычным классам:

data class Something(
    val a: String,
    val b: Any,
    val c: String
) {
    override fun toString(): String = a + b + c
}