2014-09-30 2 views
11

При создании реализаций заглушек java.sql.Connection, DataSource, ResultSet & c. для функционального теста Scala я столкнулся с несколькими случаями, когда Java-метод перегружен, причем каждый метод отличается только типом параметра массива. Например (из java.sql.Connection):Переопределение в Scala, перегруженных Java-методах, отличных от типа массива

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 interop ... достаточно легко найти обсуждение аналогичной проблемы с varargs. Наверняка кто-то сталкивался с этим вопросом раньше? Любые указатели на более раннее обсуждение или проблемы в журнале отслеживания ошибок Scala?

+0

Это действительно интересно. Похоже, что обобщение массива в Scala теряет специфику в этом процессе, поскольку девять типов массивов в Java фактически представляют собой девять несвязанных различных типов. –

+0

Er ... Вы пытались скомпилировать его? Для меня выглядит достаточно хорошо: 'object Foo {def bar (a: Array [Int]) = 1; def bar (a: Array [String]) = 2} ', а затем' Foo.bar (Array (1)) 'возвращает 1 и' Foo.bar (Array ("hello")) 'возвращает 2. Это Scala 2.10 +0,0. – sjrd

+0

Какая версия Scala вы используете и какую ошибку компилятора вы получаете. В сеансе REPL я смог отлично реализовать «Connection». –

ответ

7

Это интересная проблема, но похоже, что в современных версиях компилятора это исправлено.

В Скале 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 в - одни и те же работы в Скале 2.10.0 тоже.

В какой версии вы его протестировали?

+0

А теперь это интересно. Я на scala 2.9.2 –

Смежные вопросы