在 Scala 中,我可以覆盖 Java Calendar 的 toString 并拥有一个带 TimeZone 的构造函数吗?

In Scala, can I override Java Calendar's toString and have a constructor with a TimeZone?

我的 Scala 代码中有 Java 个日历对象,因为我与需要日历的 Java 代码交互。也许这本身就是一个问题。但如果不是,在调试器中我希望 toString 给我一些可以立即理解的东西(例如 2015-02-25T22:00:00Z 而不是默认出现的对象格式乱码。我试过 class Cal extends GregorianCalendar 但是然后当我尝试制作一个 Cal(tz: TimeZone) 构造函数时我遇到了问题。我应该怎么做?或者我应该只使用 Joda-Time?

您可能确实希望使用具有 better/safer 功能的不同 API,但您可以在给定的日历实例上混合一个特征来覆盖某些行为:

  trait SpecialPrint { self: Calendar =>    
    override def toString(): String = self.toInstant().toString + ", " + self.getTimeZone.getDisplayName
  }

  val c = new GregorianCalendar(TimeZone.getDefault) with SpecialPrint

  def operation(c: Calendar) {
    println(c)
  }

  operation(c) // prints 2015-02-25T22:46:42.097Z, Eastern Standard Time

我使用的日历已经有一个 TimeZone 构造函数,所以我认为这对你有用。

上面我使用类型化的自引用 (self: Calendar =>) 来创建正确类型的自引用以用于 toString 调用。

如果您尝试在不扩展 Calendar 的 class 上使用此 mixin,它将失败,即此代码无法编译:

  class Other()
  val s = new Other() with SpecialPrint // illegal inheritance