繁体   English   中英

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

[英]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用作类型的任何使用都应在编译后变为intjava.lang.Integer ,因此对于Scala和Java之间的互操作没有用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM