1

春にscalaの暗黙の変換を使用したいと思いJdbcTemplateます。

JdbcTemplate次の2つの方法があります:

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) 暗黙の変換が行われることを期待していました。ただし、実際には、ここでは暗黙的な変換は行いません。ここでは、メソッドがの署名に準拠しているためです。そのため、ここには暗黙の変換はありません。これを達成できる他の解決策はありますか?ありがとう。jdbcTemplateRichJdbcTemplatejdbcTemplate.update(String sql, Object... params)

4

2 に答える 2

4

メソッドに別の名前を付けてください。updateWithFunctionそれか何かを呼び出します。

あなたが言及したように、問題は Scala が暗黙的な変換を検索しないことです。これは、正しい名前と正しいパラメーターの型を持つメソッドが で直接見つかるためJdbcTemplateです。これを回避する方法は、 で見つからない名前を使用することJdbcTemplateです。

明示的にラッピングを行うこともできますがnew RichJdbcTemplate(jdbcTemplate).update(...)、それは醜いです。

于 2012-12-05T03:23:26.643 に答える
3

updateメソッドの名前を別の名前に変更します。オブジェクトで暗黙的な変換を定義し、スコープにインポートします。

object MyImplConversions {
  implicit def toRichJdbcTemplate(jdbcTemplate: JdbcTemplate) =
    new RichJdbcTemplate(jdbcTemplate)
}
于 2012-12-05T04:47:08.220 に答える