【问题标题】:Scala compiler cannot determine which overloaded method to invokeScala 编译器无法确定调用哪个重载方法
【发布时间】:2011-08-09 17:09:48
【问题描述】:

我正在尝试在 Scala 中调用 Spring 3.0 的 JdbcTemplate 类中的重载 query() 方法之一...

val args: Array[Object] = new Array[Object](1)
args(0) = id
val results: List[MyObj] = jdbcTemplate.query(SQL_STRING, args, new MyJdbcStore.MyObjRowMapper)

...我得到一个堆栈跟踪,上面写着“带有替代方法的重载方法值查询”。 (上面代码 sn-p 中的 MyObjRowMapper 是一个类,定义在 MyJdbcStore 的伴生对象中,它扩展了 Spring 的 RowMapper 接口。)“替代品”是分别具有这些参数的三个版本的 query():

java.lang.String, Array[java.lang.Object], org.springframework.jdbc.core.ResultSetExtractor
java.lang.String, org.springframework.jdbc.core.PreparedStatementSetter, org.springframework.jdbc.core.ResultSet
org.springframework.jdbc.core.PreparedStatementCreator, org.springframework.jdbc.core.PreparedStatementSetter, org.springframework.jdbc.core.ResultSetExtractor

虽然我已经明确定义了results变量的返回类型,但是为什么编译器不能确定调用哪个查询方法呢?

【问题讨论】:

  • 你确定 MyJdbcStore.MyObjRowMapper 是 ResultSetExtract 类型的实例吗?
  • 不,正如我在帖子中提到的,MyObjRowMapper 是一个 RowMapper。我正在尝试调用带有字符串、对象数组和 RowMapper 的 query() 版本,并返回一个列表。
  • 结果类型不选择重载方法。
  • 引用 Martin Odersky 的话:“重载的方法需要明确的结果类型,因为结果类型是用于确定替代方法是否适用的事物之一。” scala-programming-language.1934581.n4.nabble.com/…
  • 您是导入了java.util.List 还是这是一个Scala List

标签: scala overloading spring-jdbc


【解决方案1】:

您正在调用的query 方法返回java.util.List[T] 类型的对象。显然你期待一个 Scala 列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多