2013-06-21 76 views
1

我有一個遊戲的形式,看起來像這樣:斯卡拉選項[java.util.Date]不能被轉換爲選項[java.sql.Date]

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]] 
      ) 
     } 
    } 
) 

油滑的地方只有java.sql.Date交易,並與java.util.Date只玩交易(?)在Form對象。

使用asInstanceOf回報:

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

還有的必須是一個辦法,我寫了規則這個轉換成爲可能...... 我需要寫一個new pattern matching rule

回答

5

由於java.sql.Date是子類,所以不能將java.util.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 

或者只寫它明確:

​​

如果需要轉換非常頻繁,你可能會考慮寫一個隱式轉換從Option[java.util.Date]Option[java.sql.Date]

+2

我不認爲這是值得引入隱式轉換,如果你已經做類型歸屬顯式映射。 –

+0

感謝您的快速回復。我很感激你如何去解釋發生了什麼。 我的理解是顯式轉換更多是一次性的事情,而隱式轉換相當於編寫新的類型轉換規則嗎? – Meredith

+1

@MeredithLeu歡迎。隱式轉換是用於轉換的特殊函數,而不是類型轉換:如果您有一個值'x:A',並且您需要一個'B'並且您有一個隱式函數'f:A => B',編譯器將會用'f(x)'替換'x'。所以在字節碼級別上,它們只不過是函數調用。顯式轉換正在編寫完全相同的函數調用。請參閱:http:// stackoverflow。com/questions/2861501/can-someone-explain-me-implicit-conversions-in-scala – gzm0

4

嘗試映射Option[java.util.Date]Option[java.sql.Date]這樣的:

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

建議多說一個單詞,你可能想其實這映射到java.sql.Timestamp所以寫的時候,你不會失去任何時間精度我相信數據庫將是java.sql.Date的情況。所以代碼將是:

(success._6).map(d => new java.sql.Timestamp(d.getTime)) 
+0

謝謝!我知道使用java.sql.Timestamp而不是Date。我在我的模式中的其他地方使用Option [Timestamp],但對於這個特定的對象,一天的粒度是很好的^。^ – Meredith