覆盖Scala,重载以数组类型区分的Java方法

how*_*nch 11 scala

当创建的存根实现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
Run Code Online (Sandbox Code Playgroud)

转换为Scala,它看起来像这样:

override def prepareStatement(sql: String, columnIndexes: Array[Int]): PreparedStatement 
override def prepareStatement(sql: String, columnNames: Array[String]): PreparedStatement
Run Code Online (Sandbox Code Playgroud)

但是在Scala 2.9.2中,这不会编译,因为我们只能通过参数类型进行区分.除了在Java中实现存根之外,任何人都可以提出一个聪明的解决方案吗?

我很惊讶没有能够找到任何关于这个特定的Scala/Java互操作问题的讨论......很容易找到与varargs类似问题的讨论.当然有人之前遇到过这个问题吗?对Scala问题跟踪器中早期讨论或问题的任何指示?

Gab*_*lla 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
Run Code Online (Sandbox Code Playgroud)

并且 - 基于@ sjrd的评论 - 同样适用于scala 2.10.0.

你在哪个版本上进行测试?