如何使用 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
}
我创建了一个数据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
}