在创建 java.sql.Connection
的 stub 实现时, 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 中实现 stub 之外,任何人都可以提出一个聪明的解决方案吗?
我很惊讶无法找到有关此特定 Scala/Java 互操作问题的任何先前讨论……很容易找到有关 varargs 的类似问题的讨论。肯定有人遇到过这个问题吗?任何指向 Scala 问题跟踪器中早期讨论或问题的指针?
最佳答案
这是一个有趣的问题,但看起来在现代版本的编译器中已修复。
在 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。
你在哪个版本上测试的?
关于scala - 在 Scala 中重写,按数组类型区分的重载 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26119127/