2013-09-07 2 views
1

Прямая проблема, что я не вижу, что я делаю неправильно, - где-то в некотором роде. В основном пытается установить тип данных по умолчанию для параметров Long on, которые поступают из веб-запроса. Вот код:Типовой вопрос с Scala при работе с временными отметками

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 

ответ

3

Вы не сказали, что params есть. Похоже, это может быть Map[String, X] с некоторым типом X. params.getOrElse(key, someLong) будет считаться лучшим обычным супертипом X и Long, который, как сообщается, соответствует Any, и который не имеет метода toLong. Поскольку ваше значение по умолчанию уже давно, и поэтому его не нужно преобразовывать, я думаю, что есть toLong метод на X.

Если это так, то вы должны преобразовать значение, полученное от params, до Long (при наличии такого значения), прежде чем предоставлять значение по умолчанию. Это будет:

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

Я предполагаю, что params является Map[String, Something], и что Something ISN» t всегда числовой тип. (String?) В любом случае, когда вы вызываете params.getOrElse, он выдает общий тип между и Long и находит Any, поэтому вы не можете позвонить toLong.

Смежные вопросы