[英]scala.Int in Java variable that stores a value from Scala function
[英]How to call a scala.Function2 with a scala.Int parameter from Java
我正在尝试从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
而失败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
?
通常的答案是,您希望Scala函数的int参数是“ specialized”。
您的适配器方法应采用(String, 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 $
scala.Int
并不是应该出现在Java代码中的类型,它是为Scala编译器的内部目的而存在的。 Scala代码中将Int
用作类型的任何使用都应在编译后变为int
或java.lang.Integer
,因此对于Scala和Java之间的互操作没有用。
对于某些(不是全部)特殊类型,例如scala.Int
有一个对应的Java .class
文件,因此可以从Java使用它们,但据我所知,它从来没有用过(也许某些静态方法除外)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.