直截了当的问题,我看不出我做错了什么 - 某些类型不匹配的地方。基本上尝试在来自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
答案 0 :(得分:3)
你没有说params
是什么。看起来它可能是某个Map[String, X]
类型的X
。根据错误消息,params.getOrElse(key, someLong)
将被认为具有X
和Long
的最佳常见超类型,恰好是Any
,并且没有toLong方法。由于您的默认值恰好是Long,因此不需要转换,我想toLong
上有一个X
方法。
如果是这样,那么在提供默认值之前,您应该将从params
检索到的值转换为Long
(当存在这样的值时)。那将是:
params.get("key").map(_.toLong).getOrElse(defaultValue)
答案 1 :(得分:1)
我猜params
是Map[String, Something]
,而Something
并不总是数字类型。 (字符串?)在任何情况下,当您致电params.getOrElse
时,它会推断Something
和Long
之间的共同类型,并找到Any
,这就是为什么你不能打电话给toLong
。