2011-10-18 7 views
4

実行時にメソッドをリンクするためのinvokedynamic命令をサポートするJVM 7の上に動的に型指定された言語を実装すると仮定します。JDK7のinvokedynamicで多態性を実現する方法

動的に型指定された言語には、整数を加算して文字列を連結して整数に作用する関数addがあります。ここで、addは、(コンパイル時に)オブジェクト、整数または文字列、またはその両方を保持することしか知っていない、一般的なリスト処理メソッドによって呼び出されるとします。

invokedynamicは、メソッドをJVMバイトコードにコンパイルするときに、2つの異なる内部関数、つまり整数を追加する実際の関数と文字列を連結する実際の関数にディスパッチする必要があるので、ここで助けますか?

答えて

3

簡潔に言えば、invokedynamicでは、メソッドが属するクラスを知らなくても、指定されたシグネチャを持つメソッドを呼び出すことができます。 add()メソッドが引数としてObject(または他の共通基本型)を受け取るだけの場合は、他の無関係なクラスの中でadd(Object)メソッドを持つことができ、invokedynamicが呼び出すことができます。対象オブジェクトにメソッドがある限り、呼び出されます。

+0

私はあなたが私に言っていることを理解していると思います。これは、私の動的コールサイトが(引数の型に応じて)適切な加算器を検索して呼び出す一般的なメソッドハンドルを返さなければならないことを意味します。 – Marc

+0

それがあなたが行きたいと思う方法なら、それは正しいと思います。 'invokedynamic'にオブジェクトとメソッドシグネチャを与えると、そのオブジェクトのメソッドを呼び出します。 'invokedynamic'の前に適切なシグネチャを調べるためにあなた自身の検索をしたいのであれば、それを確かに行うことができます。 –

0

を私もしたいと思います次のリンクを発見しましたシェア:

JSR 292 Cookbook

JSR 292を使用して、動的言語ランタイムで見つけることができる通常のパターンを実装する方法を示すソースコードのコレクションです。 (そのページの説明が記載されています)

関連する問題