私の知る限り、Java 7にMethodHandleが導入されたことで、コンパイラーによって生成されたメソッドのオーバーロードが導入されました。
MethodHandleのjavadocには、次のように記載されています(例をトリミングしました)。
使用例を次に示します。
Object x, y; String s; int i; mh = ... // (Ljava/lang/String;CC)Ljava/lang/String; // (String, char, char) -> String s = (String) mh.invokeExact("daddy",'d','n'); // (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; // (Object, Object, Object) -> Object x = mh.invokeExact((Object)1, (Object)2, (Object)3); // (Ljava/util/List;)I // (List) -> int i = (int) mh.invokeExact(java.util.Arrays.asList(1,2,3)); // (Ljava/io/PrintStream;Ljava/lang/String;)V // (PrintStream, String) -> void mh.invokeExact(System.out, "Hello, world.");
上記の各呼び出しは、invokeという名前とコメントに示されているタイプ記述子を持つ単一のinvokevirtual命令を生成します。引数の型は実際の引数から直接取得されますが、戻り型は呼び出しにすぐに適用されたキャストから取得されます。このキャストはプリミティブへのキャストである可能性があります。欠落している場合、戻り値を使用するコンテキストで呼び出しが発生すると、タイプはデフォルトでObjectになります。呼び出しがステートメントとして発生する場合、キャストは不可能であり、リターンタイプはありません。呼び出しは無効です。
事実上、invokeExactとその仲間は、パラメーターとリターンタイプの可能なすべての組み合わせに対してオーバーロードがあるかのように動作します。
MethodHandlesがラムダのようなJava8の機能を準備していると聞きました。(私はそれらがすでにスクリプト言語に役立つことを知っています。)
[/前書き]
では、これらのコンパイラーによって生成されたオーバーロードがJavaに隠れているのでしょうか?将来(たとえば、拡張メソッドを使用して)さらに多くのヒントがありますか?そもそもなぜそれが必要なのですか?ただのスピード?ラムダをどのように助けますか(ラムダは匿名の内部クラスにコンパイルされると思いました)?
要するに、理論的根拠は何ですか。なぜそれら(生成されたオーバーロード)が現在および将来的に役立つのですか?
更新:ここでコンパイラが生成するオーバーロードと呼んでいるのは、オラクルの連中が署名ポリモフィックと呼んでいることです。