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

时间:2014-09-30 10:59:54

标签: scala

创建java.sql.ConnectionDataSourceResultSet& 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问题跟踪器中早期讨论或问题的任何指示?

1 个答案:

答案 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。

你测试的版本是什么版本?