まったく無関係です。scala の暗黙はコンパイル時に完全に解決されます。コンパイラは、自分で書いたようなものを挿入します。それができない場合、コンパイル時にエラーが発生します。InvokeDynamic は、実行時にメソッドを見つけ、見つからない場合は実行時に失敗することです。
具体的には、型 x にメソッド m がないところを scala で書くx.m()
と、スコープ内にある (この時点で f を呼び出すことができます) という関数である暗黙の変換を探します (この時点で f を呼び出すことができます)。これは x をパラメーターとして受け入れ、結果の型にはメソッドがありm
ます (ルールにはさらに多くの詳細がありますが、これが本質です)。x.m()
そのようなメソッドが見つかった場合、適切に型指定されたに置き換え られますf(x).m()
。コードでそのように書くこともできますが、Java ではそうしなければなりません。そのような関数 f が見つからない場合、コンパイル時エラーが発生します。
g(x)
を呼び出して、x
に渡すのに適切なタイプでない場合も、まったく同じように発生しg
ます。f
適切な型を持つ関数があればf(x)
、コードを に置き換えますg(f(x))
。繰り返しますが、プレーンな scala で自分で書くこともできますが、そのようなメソッドがなければコンパイルされません。
動的とは、コンパイル時に にメソッドがあるかどうかをあまり気にせず、実行時にm
メソッドx
を探すことです。これは、JRuby や Groovy などの動的言語が通常どのように機能するかです。scala、trait Dynamic (実験的とマークされています) に関連するものがあります。