簡體   English   中英

從Scala函數到Java函數的隱式轉換

[英]Implicit conversion from Scala function to Java Function

我想創建一個從Scala函數(可能是匿名的)到java.util.function.Function的隱式轉換。 這是我有的:

import java.util.function.{Function => JavaFunction}
implicit def scalaFunctionToJavaFunction[From, To](function: (From) => To): JavaFunction[From, To] = {
  new java.util.function.Function[From, To] {
    override def apply(input: From): To = function(input)
  }
}

它工作正常,只是當轉換的函數沒有明確指定參數類型時,類型推斷失敗:

val converted: JavaFunction[String, Int] = (s: String) => s.toInt // works fine
val converted2: JavaFunction[String, Int] = scalaFunctionToJavaFunction(s => s.toInt) // works
val converted3: JavaFunction[String, Int] = s => s.toInt // gives compilation error "missing parameter type"

編譯器能夠推斷出類型

我的問題是:

  • 為什么Scala編譯器在第三種情況下不能推斷出參數的類型?
  • 我可以修改隱式轉換以便推斷類型嗎?

我知道一個涉及這個問題相關問題 ,但沒有回答我的問題。

這個問題似乎與Java的互操作性無關,順便說一句。 如果我用自定義Scala特征替換JavaFunction ,行為將保持不變。

為什么Scala編譯器在第三種情況下不能推斷出參數的類型?

要推斷lambda表達式的參數類型期望的類型必須是String => ? (對於這種情況)。 converted3 ,期望的類型是JavaFunction[String, Int] 這不是Scala函數,所以它不起作用。 它將在斯卡拉2.12,或2.11與-Xexperimental scalac選項 這是根據規范

如果匿名函數的預期類型是scala.Functionn [S1,...,Sn,R]形狀,或者可以SAM轉換為這樣的函數類型,則可以省略參數xi的類型Ti,因為Si以預期的類型定義,並且假設Ti = Si。 此外,類型檢查e時的預期類型是R.

如果函數文字沒有預期的類型,則必須顯式指定所有形式參數類型Ti,並且未定義e的預期類型。

“SAM轉換”部分是由-Xexperimental /2.12激活的部分,默認情況下在2.11中無效。

我可以修改隱式轉換以便推斷類型嗎?

我不相信。 可以做的是更改位置轉換發生:寫入val unconverted: String => Int = s => s.toInt (或者只是val unconverted = (s: String) => s.toInt val unconverted: String => Int = s => s.toInt val unconverted = (s: String) => s.toInt )並將其傳遞給JavaFunction[String, Int]是預期的。

當你寫val foo: SomeType = bar ,編譯器正在尋找一種“證明”的方法,即賦值是有效的。 這可以通過以下兩種方式之一來證明: bar既有一個類型,也就是SomeType的子類(或者顯然是SomeType本身),或者是從任何類型barSomeType的隱式轉換。 正如你可以看到的那樣,在兩種情況下,為了協助工作,必須知道bar的類型。 但是當您編寫val converted3: JavaFunction[String, Int] = s => s.toInt ,未定義右側的類型。 編譯器知道它是一些函數,返回一個Int,但沒有參數類型,這還不夠。

另一種說法是編譯器不會檢查范圍內的每個隱式轉換,返回與LHS兼容的東西,為了使用轉換,它需要知道輸入類型。

AFAIK無法繞過它,你必須以某種方式定義rhs的類型才能使用隱式轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM