扩展另一个类的Case类失去了toString?

时间:2017-07-13 15:23:10

标签: scala case-class

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

为什么Foo没有生成toString?这是一个错误还是实际上有原因?有没有办法“把它取回”(是否有一个默认的实现可能适用于案例类)?

2 个答案:

答案 0 :(得分:5)

这不是一个错误,它是指定的行为,案例类从父级获取它的实现,而不是生成它自己的一个。

Scala Specification §5.3.2中提及:

  

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

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

我认为实现这项工作的唯一方法是在toString中再次明确覆盖Foo

答案 1 :(得分:2)

要重现默认实现,您可以使用

override def toString() = productPrefix + productIterator.mkString("(", ", ", ")")

我似乎记得这个方法在标准库中的某个地方,但是现在还找不到它。当然,这比手动实现它效率低,例如作为productPrefix + "(" + field1 + ", " + ...,但在大多数情况下,此方法不会成为热点,并且错误的机会也会减少。