在处理时间戳时键入Scala问题

时间:2013-09-07 21:29:07

标签: scala scalatra

直截了当的问题,我看不出我做错了什么 - 某些类型不匹配的地方。基本上尝试在来自Web请求的参数上设置Long的默认数据类型。这是代码:

val startTs:Long = params.getOrElse("start_ts", DateTime.yesterdayAsEpoch).toLong
val endTs:Long = params.getOrElse("end_ts", DateTime.todayAsEpoch).toLong

我的日期时间助手代码:

def todayAsEpoch: Long = {
    val c = Calendar.getInstance(TimeZone.getTimeZone("EST"))
    c.setTime(new java.util.Date())
    c.set(c.get(Calendar.YEAR),c.get(Calendar.MONTH),c.get(Calendar.DAY_OF_MONTH),0,0,0)
    c.getTimeInMillis / 1000L
  }

  def yesterdayAsEpoch: Long = {
    val c = Calendar.getInstance(TimeZone.getTimeZone("EST"))
    c.setTime(new java.util.Date())
    c.set(c.get(Calendar.YEAR),c.get(Calendar.MONTH),c.get(Calendar.DAY_OF_MONTH),0,0,0)
    ((c.getTimeInMillis / 1000L) - 86400)
  }

最后,错误:

value toLong is not a member of Any
[error]         val startTs:Long = params.getOrElse("start_ts", DateTime.yesterdayAsEpoch).toLong
[error]                                                                                    ^
[error] /vagrant/src/main/scala/com/myapp/api/controllers/FooController.scala:437: value toLong is not a member of Any
[error]         val endTs:Long = params.getOrElse("end_ts", DateTime.todayAsEpoch).toLong
[error]                                                                            ^
[error] two errors found
[error] (compile:compile) Compilation failed

2 个答案:

答案 0 :(得分:3)

你没有说params是什么。看起来它可能是某个Map[String, X]类型的X。根据错误消息,params.getOrElse(key, someLong)将被认为具有XLong的最佳常见超类型,恰好是Any,并且没有toLong方法。由于您的默认值恰好是Long,因此不需要转换,我想toLong上有一个X方法。

如果是这样,那么在提供默认值之前,您应该将从params检索到的值转换为Long(当存在这样的值时)。那将是:

params.get("key").map(_.toLong).getOrElse(defaultValue)

答案 1 :(得分:1)

我猜paramsMap[String, Something],而Something并不总是数字类型。 (字符串?)在任何情况下,当您致电params.getOrElse时,它会推断SomethingLong之间的共同类型,并找到Any,这就是为什么你不能打电话给toLong