Scala 隐式最终 class

Scala implicit final class

我正在尝试创建一种方法,通过隐式 classes 将天数添加到 Scala 中的 LocalDate 对象,但我不断收到错误消息,说 "LocalDate is a final class and cannot be extended" 或以下:

scala:73: could not find implicit value for parameter year: Int

这是我尝试使用的代码:

 implicit class UVMLocalDate(val me: Int) extends AnyVal{

 implicit def days(implicit year: Int, month: Int, day: Int) {
 LocalDate.of(year,month,me + days)
 }

 }

我只能让 class 表现得像这样:

(LocalDate.of(2015, 4, 14)) == (LocalDate.of(2015, 4, 12) + 2.days)

使用示例:

val dateEx = LocalDate.of(2015, 3, 23) + 2.days
assert(dateEx == LocalDate.of(2015, 3, 25))

谢谢

听起来您想要混合使用 scala.concurrent.duration._org.joda.time._ 的功能。

将一个日期添加到另一个日期并没有什么意义,2.days 并不是真正的 date 而是 duration。您可以继续为它定义一个新的 class 来重新发明轮子:

class Duration(millis: Long)
object Duration {
  val SecondMillis = 1000
  val MinuteMillis = SecondMillis * 60
  val HourMillis = MinuteMillis * 60
  val DayMillis = HourMillis * 24

  implicit class DurationFromDays(private val underlying: Int) extends AnyVal {
    def days: Duration = new Duration(underlying * DayMillis)
  }
}

但是,您可以通过 scala.concurrent.duration.Duration 使用 API。

然后你还需要定义一个隐含的 class 来添加一个 Duration 到一个 LocalDate.

implicit class LocalDateOps(private val underlying: LocalDate) extends AnyVal {
  def +(duration: Duration): LocalDate = ???
}

但是,有些库(如 joda-time)已经实现了向日期添加持续时间的功能。