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

Mer*_*ith 1 casting scala playframework slick

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

val form = Form( tuple( 
        /* 5 more fields */ 
        "dueDate" -> optional(date) 
)  )
Run Code Online (Sandbox Code Playgroud)

我正试图"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]] 
            )
        }
    }
)
Run Code Online (Sandbox Code Playgroud)

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

使用asInstanceOf回报:

     ClassCastException: java.util.Date cannot be cast to java.sql.Date
Run Code Online (Sandbox Code Playgroud)

必须有一种方法让我为这个演员编写规则是可能的......我是否需要编写一个新的模式匹配规则

gzm*_*zm0 5

你不能转换java.util.Datejava.sql.Date因为java.sql.Date是一个子类.你可以做的是创建一个新的实例java.sql.Date:

val x = new java.util.Date()
val y = new java.sql.Date(x.getTime())
Run Code Online (Sandbox Code Playgroud)

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

implicit def date2sqlDate(d: java.util.Date) = new java.sql.Date(d.getTime())
Run Code Online (Sandbox Code Playgroud)

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

你可以:

val x: Option[java.util.Date]
x.map(_: java.sql.Date) // using implicit conversion
Run Code Online (Sandbox Code Playgroud)

或者只是明确地写出来:

x.map(d => new java.sql.Date(d.getTime()))
Run Code Online (Sandbox Code Playgroud)

如果你需要转换非常频繁,你可能会考虑从写的隐式转换Option[java.util.Date]Option[java.sql.Date].

  • 如果您已经使用类型归属进行显式映射,我认为不值得引入隐式转换. (2认同)