如何使用 toString 扩展数据 class

How to extend a data class with toString

我创建了一个数据class

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

稍后在我的程序中,我需要此数据的字符串表示形式 class 我尝试扩展 toString 方法。

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

这里的问题是,它不允许扩展(覆盖)toString 函数,因为它不适用于顶级函数。

如何正确override/extend自定义数据的toString方法class?

添加 .toString() 扩展函数不起作用,因为:

  • 扩展函数不能参与虚拟调用(they are resolved statically)。换句话说,扩展不能覆盖成员函数。
  • 如果有匹配的成员函数,优先于扩展。如果添加扩展函数 fun Something.toString() = ...,则 s.toString() 不会解析到它,因为继承自 Any 的相应成员获胜。

但在你的情况下,没有什么能阻止你在 Something class 体内覆盖 toString,因为 data classes 可以像常规 classes:

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