如何避免scala的case类默认toString函数被覆盖?

时间:2014-12-14 03:10:02

标签: scala case-class

Scala案例类有一个默认的toString函数。但是当这个case类使用现有的toString()函数扩展一个特征时,它将变得无用。我该如何防止这种情况发生?

3 个答案:

答案 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 }
                                                   ^