これは奇妙に思えます。以下は正常にコンパイルされます。
def foo(s: String) = "balsh"
def foo(s: String)(s2: String) = "kahsd"
2 番目のパラメーターを暗黙的にしても、問題なくコンパイルされます。
ただし、次の場合はそうではありません。
def foo(s: String) = "bjda"
def foo(s: String)(fun: String => String) = fun(s)
^「オーバーロードされた定義へのあいまいな参照」のためにコンパイルされません。
私の当初の考えでは、Scala が関数を Java に変換する方法が原因で、2 つの署名が同じになるというものでした。ただし、javap を使用してコード化されたコンパイル (2 番目の関数のみ) を見ると、そのような関数は実際には次のように変換されていることがわかります。
public java.lang.String foo(java.lang.String, scala.Function1);
そのため、別の署名を持つ別のメソッドが作成されます。では、なぜこれがコンパイルに失敗するのでしょうか?
さらにややこしいことに、以下は実際に問題なくコンパイルされます。
def foo(s: String) = "bjda"
def foo(s: String, fun: String => String) = fun(s)
関数をパラメータの最初のセットの一部にすれば、すべて問題ありません!
なぜこれが起こっているのか誰にも分かりますか?
編集:
だから私はこれを試しました:
object main {
def write(s: String) = "sasd"
def write(s: String)(implicit s2: String => String) = s2(s)
}
単純に、2 番目のパラメーターの関数を暗黙的にしました。ほら、これはコンパイルされます。
これは、生成される Java コードです。
public final class main$ extends java.lang.Object{
public static final main$ MODULE$;
public static {};
public java.lang.String write(java.lang.String);
public java.lang.String write(java.lang.String, scala.Function1);
}
これは、暗黙のない元のものから私が期待していたものです!