为什么不应用转换?

时间:2012-12-05 02:58:19

标签: spring scala implicit-conversion jdbctemplate

我想在spring JdbcTemplate中使用scala的隐式转换。

JdbcTemplate有以下两种方法:

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

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

PreparedStatementSetter只是一个界面,我想将函数值传递给JdbcTemplate。这意味着我想将其改为

JdbcTemplate.update(sql:String,setter:PreparedStatement => Unit)//(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)的签名。这就是为什么这里没有隐式转换的原因。有没有其他解决方案可以实现这一目标?感谢。

2 个答案:

答案 0 :(得分:4)

只需给你的方法一个不同的名字;称之为updateWithFunction或其他什么。

正如您所提到的,问题是Scala不会寻找隐式转换,因为它会在JdbcTemplate上直接找到具有正确名称和正确参数类型的方法。解决这个问题的方法是使用不会<{1}} 找到的名称。

您也可以明确地进行换行,JdbcTemplate,但那更加丑陋。

答案 1 :(得分:3)

将更新方法重命名为其他方法。在对象中定义隐式转换并导入范围:

object MyImplConversions {
  implicit def toRichJdbcTemplate(jdbcTemplate: JdbcTemplate) =
    new RichJdbcTemplate(jdbcTemplate)
}