【问题标题】:Scala implicit final classScala 隐式最终类
【发布时间】:2016-04-10 23:58:02
【问题描述】:

我正在尝试创建一种通过隐式类向 Scala 中的 LocalDate 对象添加天数的方法,但我不断收到错误消息,要么是“LocalDate 是最终类,不能扩展”,要么如下:

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)
 }

 }

我只能让班级表现得像这样:

(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))

谢谢

【问题讨论】:

  • 你在使用 java.time 吗?在这种情况下,您不能将 2 个LocalDates 加在一起。它也不提供 Scala + 方法。
  • 此外,您正在为“days”方法引入 3 个隐式 Int 参数,隐式参数按类型解析,因此所有 3 个参数始终具有相同的值。
  • 我在粘贴的隐式类和您希望它的行为方式之间找不到太多联系。
  • 请重新表述问题。提供一个使用这种新的days 方法的代码示例将非常有帮助。

标签: scala implicit-conversion implicit


【解决方案1】:

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

将日期添加到另一个日期并没有什么意义,2.days 并不是真正的日期,而是持续时间。你可以通过为它定义一个新类来重新发明轮子:

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。

然后您还需要定义一个隐式类,用于将Duration 添加到LocalDate

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多