Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免scala的case类默认toString函数被重写?_Scala_Case Class - Fatal编程技术网

如何避免scala的case类默认toString函数被重写?

如何避免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 并使用以下特性运行它

Scala case类有一个默认的toString函数。但是,当这个case类使用现有的toString函数扩展trait时,它将变得无用。我怎样才能避免这种情况呢?

我认为这是一个可行的解决办法,可能太拘谨了,由你决定。这涉及到一个特点

现在使用一些示例进行尝试:

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