簡體   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