如何避免scala的case类默认toString函数被重写?
Scala case类有一个默认的toString函数。但是,当这个case类使用现有的toString函数扩展trait时,它将变得无用。我怎样才能避免这种情况呢?我认为这是一个可行的解决办法,可能太拘谨了,由你决定。这涉及到一个特点 现在使用一些示例进行尝试:如何避免scala的case类默认toString函数被重写?,scala,case-class,Scala,Case Class,Scala case类有一个默认的toString函数。但是,当这个case类使用现有的toString函数扩展trait时,它将变得无用。我怎样才能避免这种情况呢?我认为这是一个可行的解决办法,可能太拘谨了,由你决定。这涉及到一个特点 现在使用一些示例进行尝试: trait Human { override def toString() = "Human" } case class European(firstName:String) extends Human 并使用以下特性运行它
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)
当然还有你留下的特质
scala> new European("Adele")
res1: European = Human
好的,下面是最简单的答案:
override def toString = ScalaRunTime._toString(this)
故事的结尾:更确切地说,case类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 }
^
有一个类似的问题:那是干巴巴的,简单的。noob问题:那给了我错误,原因有几个;我做到了这一点:覆盖def toString=ScalaRunTime.\u toString这一点我必须在toString之后添加paren。此外,我必须让我的特定类显式扩展产品。有没有办法避免这种情况?另外,我使用import scala.runtime.ScalaRunTime来避免完全限定名称。@不仅仅是yeti声明为case类等同于扩展产品。其他部分与不同版本中的scala快捷方式相关,并不重要。
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 }
^