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,为什么Foo没有得到它的toString生成?这是一个bug还是真的有原因?有没有办法“找回它”(是否有一个适用于案例类的默认实现)?这不是一个bug,而是案例类从父类获得它的实现而不是生成它自己的实现的指定行为 这在以下文件中提到: 每个case类都隐式重写类的某些方法定义 scala.AnyRef除非已经给出了相同方法的定义 在case类本身或同一方法的具体定义中 是在case类的某个基类中给出的,与AnyRef不同。 特别是: 方法toString:String返回包含类及其元素名称的字

为什么
Foo
没有得到它的
toString
生成?这是一个bug还是真的有原因?有没有办法“找回它”(是否有一个适用于案例类的默认实现)?

这不是一个bug,而是案例类从父类获得它的实现而不是生成它自己的实现的指定行为

这在以下文件中提到:

每个case类都隐式重写类的某些方法定义
scala.AnyRef
除非已经给出了相同方法的定义 在case类本身或同一方法的具体定义中 是在case类的某个基类中给出的,与AnyRef不同。 特别是:

  • 方法
    toString
    :String返回包含类及其元素名称的字符串表示形式

我认为实现此功能的唯一方法是在
Foo
中再次显式重写
toString

要复制默认实现,可以使用

class Bar { override def toString() = "Bar" }
case class Foo(s: String) extends Bar
Foo("bar") // "Bar"

我似乎记得这个方法在标准库中的某个地方,但现在找不到它。当然,这比手动实现效率要低,例如作为
productPrefix+”(“+field1+”,”+…
,但在大多数情况下,这种方法不会成为热点,而且出错的机会更少。

是的,我明白了,我必须重写
toString
…问题是我重写它的目的是什么?我是否可以调用某个函数来获得默认行为,或者我必须实际重复整个实现tion?@Dima您的意思是:“是否有API提供case类并获取该类的字符串表示形式?”?如果是这样的话,不确定,也许是在一个任意的case类上查看反编译的
toString
,尽管我认为这可能是一些编译器实现细节。@Dima也许这会有帮助:它是否适用于嵌套结构?即case类中的case类?它将使用该case类的
toString
方法,这将再次e要么是默认的,要么是由您自己实现的,而且(据我所知)哪一个都不重要。当然,如果您希望像中那样进行漂亮的打印,事情会变得更复杂,但标准实现无法做到这一点。我想您试图记住的方法是
ScalaRuntime.\u toString(this)
,如前所述:)
override def toString() = productPrefix + productIterator.mkString("(", ", ", ")")