[英]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.