2012-12-05 17 views
1

我想在彈簧JdbcTemplate中使用scala的隱式轉換。爲什麼不應用轉換?

JdbcTemplate有以下2種方法:

jdbcTemplate.update(String sql, Object... params)    // (1) 

jdbcTemplate.update(String sql, PreparedStatementSetter pss) // (2) 

PreparedStatementSetter只是一個接口,並且我想只是一個函數值傳遞給JdbcTemplate。這意味着我要改變它是

JdbcTemplate.update(SQL:字符串,二傳手:PreparedStatement的=>單元)//(3)

我所做的是創建RichJdbcTemplate,作爲JdbcTemplate包裝:

class RichJdbcTemplate(jdbcTemplate: JdbcTemplate) { 

    def update(sql: String, setter: PreparedStatement => Unit) { 
    jdbcTemplate.update(sql, new PreparedStatementSetter() { 
     def setValues(ps: PreparedStatement) { 
     setter(ps) 
     } 
    }) 
    } 
} 

而且我預計,每次如果我叫jdbcTemplate.update(sql, setter: PreparedStatement => Unit) 會有jdbcTemplateRichJdbcTemplate之間的隱式轉換。但實際上它並沒有在這裏進行隱式轉換。因爲這裏的方法符合jdbcTemplate.update(String sql, Object... params)的簽名。這就是爲什麼這裏沒有隱式轉換的原因。有沒有其他解決方案可以實現這一目標?謝謝。

+3

任何人都可以解釋爲什麼此問題已關閉?這對我來說似乎是一個完全合理的問題。 – dhg

回答

4

只要給你的方法一個不同的名字;叫它updateWithFunction什麼的。

正如您所提到的,問題在於Scala不會尋找隱式轉換,因爲它直接在JdbcTemplate上找到具有正確名稱和正確參數類型的方法。解決方法是使用將不會找到的名稱JdbcTemplate

你也可以做明確的包裝,new RichJdbcTemplate(jdbcTemplate).update(...),但這是醜陋的。

3

將更新方法重命名爲其他內容。定義對象中的隱式轉換並導入到範圍中:

object MyImplConversions { 
    implicit def toRichJdbcTemplate(jdbcTemplate: JdbcTemplate) = 
    new RichJdbcTemplate(jdbcTemplate) 
} 
相關問題