scala - 在 Scala 中重写,按数组类型区分的重载 Java 方法

标签 scala

在创建 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/

相关文章:

scala - 将 S3 挂载到数据 block

scala - 使用 scala sbt 对 kafka + flink 示例进行故障排除?

scala - 如何扁平化嵌套元组?

scala - map 成员的排序是否可靠?

scala - 为什么Scala中的String与Int,Boolean,Byte ...不同?

scala - 基于最大日期记录的 Spark 过滤器

scala - 任何支持 SBT 的 IDE?

java - 如何在scala中保存案例类列表

scala - 在 Mockito 中验证按名称的参数

scala - 如何从多个文件写入组装 Akka Streams 接收器?