如何使用Java中的scala.Int参数调用scala.Function2

时间:2018-06-14 00:21:27

标签: java scala interop

我试图从java调用scala.Function2:

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

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

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

如何在java中创建一个可以传递给bar()的scala.Int

2 个答案:

答案 0 :(得分:0)

通常的答案是你想要你的Scala功能&#34;专业&#34;对于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 $ 

答案 1 :(得分:0)

scala.Int不是一个应该出现在Java代码中的类型,它存在于Scala编译器的内部用途中。在编译之后,Int作为Scala代码中的类型的任何用法都应该变为intjava.lang.Integer,因此它对于Scala和Java之间的互操作不是很有用。

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