Scala Option [java.util.Date]无法强制转换为Option [java.sql.Date]

时间:2013-06-21 17:58:22

标签: scala casting playframework slick

我有一个看起来像这样的Play表单:

val form = Form( tuple( 
        /* 5 more fields */ 
        "dueDate" -> optional(date) 
)  )

我正在尝试将"dueDate"插入Slick中的对象中。

newAuditForm.bindFromRequest.fold(
    errors => BadRequest(views.html.error(form)),
    success => {
        Database.forDataSource(DB.getDataSource()) withSession {
            Things.forInsert.insert Thing(
                (success._6).asInstanceOf[Option[java.sql.Date]] 
            )
        }
    }
)

其中Slick仅处理java.sql.Date,而Play仅处理java.util.Date对象中的Form(?)。

使用asInstanceOf返回:

     ClassCastException: java.util.Date cannot be cast to java.sql.Date

我必须有办法为这个演员写一条规则才有可能...... 我需要写一个new pattern matching rule吗?

2 个答案:

答案 0 :(得分:5)

您无法将java.util.Date强制转换为java.sql.Date,因为java.sql.Date是一个子类。您可以做的是创建java.sql.Date的新实例:

val x = new java.util.Date()
val y = new java.sql.Date(x.getTime())

如果您认为有用,可以定义隐式转换:

implicit def date2sqlDate(d: java.util.Date) = new java.sql.Date(d.getTime())

但是,这不会在选项内转换(演员也不会工作,因为它不是演员而是转换)。

你可以:

val x: Option[java.util.Date]
x.map(_: java.sql.Date) // using implicit conversion

或者只是明确地写出来:

x.map(d => new java.sql.Date(d.getTime()))

如果您经常需要转换,可以考虑编写从Option[java.util.Date]Option[java.sql.Date]的隐式转换。

答案 1 :(得分:4)

尝试将Option[java.util.Date]映射到Option[java.sql.Date],如下所示:

(success._6).map(d => new java.sql.Date(d.getTime))

还有一条建议,您可能希望将其实际映射到java.sql.Timestamp,以便在将其写入数据库时​​不会失去任何时间精度,因为我认为{{1}会出现这种情况。 }。所以代码是:

java.sql.Date