【问题标题】:Using scala vararg methods in java在java中使用scala vararg方法
【发布时间】:2012-01-08 17:12:36
【问题描述】:

为什么所有的 scala 可变参数方法,当从 java 中使用时,似乎都接受一个 Seq 变量,并且不能用作 java 本机可变参数方法。这是一个错误吗?

例如,Buffer 具有方法 def append(elems: A*): Unit。但在 java 中它有另一个签名:void append(Seq<A>)

【问题讨论】:

    标签: scala scala-collections scala-java-interop


    【解决方案1】:

    您可以使用:_* 在可变参数中轻松转换Seq。例如:

    val b = collection.mutable.ListBuffer.empty[Int]
    b.append(List(1, 2):_*)
    

    这样可以避免集合 API 中的代码重复。

    您也可以简单地使用appendAll

    b.appendAll((List(1, 2))
    

    【讨论】:

    • 嗯,是的,我可以,但这如何回答我的问题?))
    • 我刚刚修改了答案。
    • 问题不在于 Seq 不能转换为 scala 中的可变参数。问题是我必须在 Java 中创建一个 Seq 才能使用带有可变参数的方法。
    • 投了反对票,因为您仍在回答与所问问题不同的问题。
    【解决方案2】:

    这不是错误。这是一种设计选择,它倾向于在 Scala 中使用 vararg,而不是与 Java 的互操作性。例如,它允许您将 List 传递给 Scala 可变参数方法,而无需在途中将其转换为 Array

    如果您需要使用 Java 中的 Scala 可变参数,您应该创建一些 scala Seq。例如,您可以编写一个 Java 包装器来自动创建一个数组,然后使用来自 Predef 对象的 genericWrapArray 方法。

    【讨论】:

    【解决方案3】:

    如果您控制 scala 代码,您可以使用 @varargs 使其生成与 java 兼容的 varags 方法,例如@varargs def append(elems: A*): Unit = {}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 2018-12-11
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多