如何用 toString 扩展数据类

我创建了一个数据类

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

在后面的程序中,我需要这个数据类的字符串表示形式,我试图扩展 toString方法。

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

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

如何正确地覆盖/扩展定制数据类的 toString 方法?

35936 次浏览

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

  • 扩展函数不能参与虚调用(它们是静态分解的)。换句话说,扩展不能覆盖成员函数。
  • 如果存在匹配的成员函数,则优先于扩展名。如果您添加一个扩展函数 fun Something.toString() = ...,那么 s.toString()将不会被解析为它,因为从 Any继承的对应成员将获胜。

但是在您的例子中,没有什么可以阻止您在 Something类主体中重写 toString,因为 data类可以像普通类一样拥有主体:

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