在 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
我的 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