我试图从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
?
答案 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代码中的类型的任何用法都应该变为int
或java.lang.Integer
,因此它对于Scala和Java之间的互操作不是很有用。
对于某些(并非所有)特殊类型(如scala.Int
),存在相应的Java .class
文件,因此可能从Java中使用它们,但是据我所知,它从来没用过(除了一些静态方法)。