1

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

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

我的 DateTime 帮助代码:

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
4

2 回答 2

3

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

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

params.get("key").map(_.toLong).getOrElse(defaultValue)
于 2013-09-07T21:55:29.903 回答
1

我猜params是 a Map[String, Something],这Something并不总是数字类型。(字符串?)无论如何,当您调用 时,它会推断and和params.getOrElsefind 之间的常见类型,这就是您不能调用它的原因。SomethingLongAnytoLong

于 2013-09-07T21:47:13.737 回答