【问题标题】:How to call a scala.Function2 with a scala.Int parameter from Java如何使用 Java 中的 scala.Int 参数调用 scala.Function2
【发布时间】:2026-02-01 21:35:01
【问题描述】:

我正在尝试从 java 调用 scala.Function2:

static public String foo(scala.Function2<String, scala.Int, String> bar) {
    return "Hello " + bar.apply("World", 2);
}

但是编译失败,在调用bar.apply 的第二个参数上出现incompatible types: int cannot be converted to scala.Int

new scala.Int(2)scala.Int.unbox(2)scala.Int.box(2) 或创建像 object Helper { def convert(i:Int):Int = i } 这样的 scala 转换器函数也不起作用。

如何创建一个scala.Int,以便在java 中传递给bar()?

【问题讨论】:

  • 如果您可以控制 bar 的签名,则可以使用 java.lang.Integer 代替 scala.Int。

标签: java scala interop


【解决方案1】:

通常的答案是您希望您的 Scala 函数“专门”用于 int 参数。

您的适配器方法应该采用(String, Int) 并转发给函数,由于恶意字符串,这不是专门的签名。

通常,非专用签名将拆箱并转发到专用方法。

显示普通传递一个int:

passint $ cat p.scala

package p

class C {
  def f(): (Int => String) = (i => i.toString * i)
}
passint $ cat p/Main.java 

package p;

public class Main {
    public static void main(String... args) {
        C c = new C();
        System.out.println(c.f().apply(42));
    }
}
passint $ scalac p.scala
passint $ javac -cp .:/Users/andrew/scala-2.12.6/lib/scala-library.jar p/Main.java
passint $ java -cp .:/Users/andrew/scala-2.12.6/lib/scala-library.jar p.Main
424242424242424242424242424242424242424242424242424242424242424242424242424242424242
passint $ 

【讨论】:

    【解决方案2】:

    scala.Int 只是不应该出现在 Java 代码中的类型,它的存在是为了 Scala 编译器的内部目的。 Int 在 Scala 代码中作为类型的任何使用在编译后都应该变为 intjava.lang.Integer,因此它对 Scala 和 Java 之间的互操作没有用处。

    对于某些(不是全部)特殊类型,例如 scala.Int,有一个对应的 Java .class 文件,因此可能在 Java 中使用它们,但据我所知,它从来没有用处(可能除了一些静态方法)。

    【讨论】: