class Bar { override def toString() = "Bar" }
case class Foo(s: String) extends Bar
Foo("bar") // "Bar"
为什么Foo
没有生成toString
?这是一个错误还是实际上有原因?有没有办法“把它取回”(是否有一个默认的实现可能适用于案例类)?
答案 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 + ", " + ...
,但在大多数情况下,此方法不会成为热点,并且错误的机会也会减少。