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

时间:2015-02-25 22:12:36

标签: scala constructor calendar tostring

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

1 个答案:

答案 0 :(得分:1)

您可能希望使用具有更好/更安全功能的其他API,但您可以在给定的Calendar实例上混合使用特征来覆盖某些行为:

  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的类上使用此mixin,它将失败,即此代码不会编译:

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