【问题标题】:calling java varargs from scala with overloading通过重载从scala调用java varargs
【发布时间】:2015-04-19 20:46:10
【问题描述】:

这是另一个与可变参数功能相关的 scala-java 兼容性问题。关键区别在于java的部分是重载的。

它类似于这个 scala 代码:

object Test {
  def test( xa : String* ) = print( xa.mkString(",") )
  def test( xs : Seq[String] ) = print( xs.mkString(",") )
}

Scala 与 java 不同,将此类重载标记为无效

error: double definition:
def test(xa: String*): Unit at line 11 and
def test(xs: Seq[String]): Unit at line 12
have same type after erasure: (xa: Seq)Unit
         def test( xs : Seq[String] ) = print( xs.mkString(",") )
             ^

但是java同意编译类似的构造。

这让 scala 感到惊讶,它在尝试调用适当的 java 方法时会产生错误。 scala 编译器留下“这里不允许使用 `:_*' 注释(这种注释只允许在 *-parameters 的参数中)”消息

在这种情况下如何正确调用可变参数方法?


我在scala issues tracker中发现了相应的bug

【问题讨论】:

  • 你可以在你的帖子中添加java方法的签名吗?
  • 见 javafx.collections.ObservableList.addAll 它可能被其他重载形式调用,但我对 vararg 调用感到好奇。
  • 我认为你必须向我们展示你是如何从 Scala 调用这些方法的;根据您的描述,我无法重现这种情况...

标签: java scala overloading variadic-functions


【解决方案1】:

我在扩展一些 Java 接口时遇到了类似的问题。

具体来说,org.hibernate.Session 有这两个虚拟方法:

ProcedureCall createStoredProcedureCall(String var1, Class... var2);

ProcedureCall createStoredProcedureCall(String var1, String... var2);

而且,正如您所经历的,如果您尝试直接在 Scala 类中实现它们,Scala 会报错。目前,我所知道的唯一解决方法是在 Java 中创建一个“桥”类,该类实现这两个方法并将它们的调用传递给两个没有重载命名的新虚函数。 (见下面的例子)

对于问题中给出的示例情况,由于不可能重载,因此有必要为两个函数指定不同的名称。不幸的是,这是目前唯一可行的解​​决方案。

@Override
public ProcedureCall createStoredProcedureCall(String procedureName, Class... resultClasses) {
    return createStoredProcedureCall0(procedureName, resultClasses);
}

abstract ProcedureCall createStoredProcedureCall0(String procedureName, Class... resultClasses);

@Override
public ProcedureCall createStoredProcedureCall(String procedureName, String... resultSetMappings) {
    return createStoredProcedureCall1(procedureName, resultSetMappings);
}

abstract public ProcedureCall createStoredProcedureCall1(String procedureName, String... resultSetMappings);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2015-10-16
    • 2011-11-13
    相关资源
    最近更新 更多