【问题标题】:toString method for inherited case class in ScalaScala中继承案例类的toString方法
【发布时间】:2020-04-26 19:41:18
【问题描述】:

我在为 Scala 中的案例类调用 toString 方法时遇到了一些不一致的问题。第一个代码示例:

case class Person(name: String, age: Int)
val jim = Person("jim", 42)
println(jim)

输出:Person(jim,42)

对于下一个代码示例,我使用了一个扩展 Exception 的案例类:

case class JimOverslept(msg: String) extends Exception
try {
  throw 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 inheritance tostring case-class


    【解决方案1】:

    根据SLS 5.3.2 Case Classes

    每个案例类都隐式地覆盖了类的一些方法定义 scala.AnyRef 除非已经给出了相同方法的定义 在案例类本身或同一方法的具体定义中 在不同于 AnyRef 的案例类的某些基类中给出。

    现在toString 已经被基类提供了

    case class JimOverslept(msg: String) extends Exception
    

    其中Exception 扩展了基础Throwable,它提供了toString 定义。因此尝试像这样在案例类本身中提供覆盖

    case class JimOverslept(msg: String) extends Exception {
      override def toString: String = scala.runtime.ScalaRunTime._toString(this)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      相关资源
      最近更新 更多