我在Scala中为案例类调用toString
方法时遇到了一些不一致之处。第一个代码示例:
case class Person(name: String, age: Int)
val jim = new Person("jim", 42)
println(jim)
输出:Person(jim,42)
下一个代码示例:
case class JimOverslept(msg: String) extends Exception
try {
throw new JimOverslept(msg = "went to bed late")
} catch {
case e: JimOverslept => println(e)
}
输出:playground.CaseClassOutput$JimOverslept
实际上,我希望输出类似JimOverslept(went to bed late)
两个真实输出如此不同的原因是什么?什么是获得输出的最佳方法看起来像所需的一种[JimOverslept(went to bed late)
)
每个案例类都隐式重写该类的某些方法定义
scala.AnyRef
除非已经给出相同方法的定义在案例类本身或相同方法的具体定义中在不同于AnyRef的案例类的某些基类中给出。
现在toString
已经由基类提供了
case class JimOverslept(msg: String) extends Exception
其中Exception
扩展了提供Throwable
定义的基数toString
。因此,请尝试在case类本身中提供替代,例如
case class JimOverslept(msg: String) extends Exception {
override def toString: String = scala.runtime.ScalaRunTime._toString(this)
}