创建java.sql.Connection
,DataSource
,ResultSet
& c的存根实施时。对于Scala功能测试,我遇到了几种Java方法过载的情况,每种方法只能通过数组参数的类型来区分。例如(来自java.sql.Connection
):
PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException
PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException
转换为Scala,它看起来像这样:
override def prepareStatement(sql: String, columnIndexes: Array[Int]): PreparedStatement
override def prepareStatement(sql: String, columnNames: Array[String]): PreparedStatement
但是在Scala 2.9.2中,这不会编译,因为我们只能通过参数类型进行区分。除了在Java中实现存根之外,任何人都可以提出一个聪明的解决方案吗?
我很惊讶没有能够找到任何关于这个特定Scala / Java互操作问题的事先讨论......很容易找到与varargs类似问题的讨论。当然有人之前遇到过这个问题吗?对Scala问题跟踪器中早期讨论或问题的任何指示?
答案 0 :(得分:7)
这是一个有趣的问题,但在现代版本的编译器中看起来已经修复了。
在scala 2.11.2中
scala> :paste
// Entering paste mode (ctrl-D to finish)
def prepareStatement(sql: String, columnNames: Array[String]): String = "foo"
def prepareStatement(sql: String, columnIndexes: Array[Int]): String = "bar"
// Exiting paste mode, now interpreting.
prepareStatement: (sql: String, columnNames: Array[String])String <and> (sql: String, columnIndexes: Array[Int])String
prepareStatement: (sql: String, columnNames: Array[String])String <and> (sql: String, columnIndexes: Array[Int])String
scala> prepareStatement("bah", Array(1,2,3))
res11: String = bar
scala> prepareStatement("bah", Array("foo","bar","baz"))
res12: String = foo
和 - 基于@ sjrd的评论 - 同样适用于scala 2.10.0。
你测试的版本是什么版本?