Scala案例类有一个默认的toString函数。但是当这个case类使用现有的toString()函数扩展一个特征时,它将变得无用。我该如何防止这种情况发生?
答案 0 :(得分:24)
好的,这是最简单的答案:
override def toString = ScalaRunTime._toString(this)
故事结束:)
答案 1 :(得分:8)
这是我认为可行的解决方法,可能是太多的仪式,你决定。它涉及trait
。
trait StandardToString { this:Product =>
override def toString = productPrefix + productIterator.mkString("(", ",", ")")
}
现在尝试一些样本:
trait Human {
override def toString() = "Human"
}
case class European(firstName:String) extends Human
并使用特征运行它:
scala> new European("Falco") with StandardToString
res0: European with StandardToString = European(Falco)
当然,trait
还剩下
scala> new European("Adele")
res1: European = Human
答案 2 :(得分:1)
更准确地说,没有生成案例类toString
,而不是它被覆盖。
这不是一个很好的答案或解决方法。
scala> trait X { override def toString = "X" }
defined trait X
scala> case class Y(i: Int) extends X
defined class Y
scala> Y(42)
res0: Y = X
scala> case class Y(i: Int)
defined class Y
scala> class Z(x: Int) extends Y(x) with X { override def toString = super[Y].toString }
defined class Z
scala> new Z(42)
res1: Z = Y(42)
你不能用特质做到这一点:
scala> trait R extends Y { override def toString = super[Y].toString }
<console>:9: error: Implementation restriction: traits may not select fields or methods from super[C] where C is a class
trait R extends Y { override def toString = super[Y].toString }
^