(57)【要約】【課題】  移行互換性を維持しながらジェネリック型を具体化する技術を提供する。【解決手段】  本発明によれば、移行互換性を維持しながらジェネリック型を具体化する技術が提供される。この技術によれば、生の型と関連するがバイナリーファイルにおいて表現されることのない実型パラメータがランタイムにおいて動的に推測される。生のタイプのインスタンスであるオブジェクトの使用に基づいてランタイムで実型パラメータが推測される。【選択図】      図１
2006302285.tif 000002
【特許請求の範囲】
【請求項１】
ジェネリック型具体化方法において、
ランタイムにおける第一オブジェクトの利用に基づいて、前記第一オブジェクトがインスタンスであるジェネリック型の第一実型引数を決定し、
前記第一実型引数を表わすデータを発生し、
前記第一オブジェクトと前記データとの間の関連を確立する、
ことを包含していることを特徴とする方法。
【請求項２】
請求項１において、前記第一実型引数を決定する場合に、更に、初期的に前記第一実型引数が拘束型により拘束される不確定な型であることを確立することを包含している方法。
【請求項３】
請求項２において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて第二オブジェクトが前記第一オブジェクト内に挿入されたことを決定し、
前記第二オブジェクトが前記第一オブジェクト内に挿入されたことの決定に応答して、
前記第二オブジェクトがインスタンスである特定の型を決定し、
前記特定の型及び前記拘束型の両方の最も特定的な上位型を決定し、
前記拘束型を前記最も特定的な上位型へアップデートする、
上記各ステップを実施する、
ことを包含している方法。
【請求項４】
請求項１において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが、入力パラメータとして第二実型引数と関連しているジェネリック型である第二オブジェクトを受付けるプログラマチックメソッドへパスされたことを決定し、
前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第一実型引数を前記第二実型引数へアップデートする、
ことを包含している方法。
【請求項５】
請求項１において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリック型である第二オブジェクトへ割当てられたことを決定し、
前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第一実型引数を前記第二実型引数へアップデートする、
ことを包含している方法。
【請求項６】
請求項１において、前記第一実型引数を決定する場合に、更に、初期的に、前記第一実型引数を第一上限型により拘束される不確定な型として確立することを包含している方法。
【請求項７】
請求項６において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが、入力パラメータとして、第二実型引数と関連しているジェネリック型である第二オブジェクトを受付けるプログラマチックメソッドへパスされたことを決定し、
前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第二実型引数が第二上限型により拘束される不確定な型を特定するか否かを決定し、
前記第二実型引数が前記第二上限型により拘束される不確定な型を特定することを決定することに応答して、
前記第一上限型及び前記第二上限型の両方の最も特定的でない下位型を決定し、
前記第一上限型を前記最も特定的でない下位型へアップデートする、
上記各ステップを実施する、
ことを包含している方法。
【請求項８】
請求項６において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが第二実型引数と関連しているジェネリック型である第二オブジェクトへ割当てられたことを決定し、
前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第二実型引数が第二上限型により拘束される不確定な型を特定するか否かを決定し、
前記第二実型引数が前記第二上限型により拘束される不確定な型を特定することを決定することに応答して、
前記第一上限型及び前記第二上限型の両方の最も特定的でない下位型を決定し、
前記第一上限型を前記最も特定的でない下位型へアップデートする、
上記各ステップを実施する、
ことを包含している方法。
【請求項９】
請求項１において、前記第一実型引数を決定する場合に、更に、初期的に、前記第一実型引数を第一下限型により拘束される不確定な型として確立することを包含している方法。
【請求項１０】
請求項９において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが第二実型引数と関連しているジェネリック型である第二オブジェクトを入力パラメータとして受付けるプログラマチックメソッドへパスされたことを決定し、
前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第二実型引数が第二下限型により拘束される不確定な型を特定するか否かを決定し、
前記第二実型引数が前記第二下限型により拘束される不確定な型を特定することを決定することに応答して、
前記第一下限型及び前記第二下限型の両方の最も特定的な上位型を決定し、
前記第一下限型を前記最も特定的な上位型へアップデートする、
上記各ステップを実施する、
ことを包含している方法。
【請求項１１】
請求項９において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが第二実型引数と関連しているジェネリック型である第二オブジェクトへ割当てられたことを決定し、
前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第二実型引数が第二下限型により拘束される不確定な型を特定するか否かを決定し、
前記第二実型引数が前記第二下限型により拘束される不確定な型を特定することを決定することに応答して、
前記第一下限型及び前記第二下限型の両方の最も特定的な上位型を決定し、
前記第一下限型を前記最も特定的な上位型へアップデートする、
上記各ステップを実施する、
ことを包含している方法。
【請求項１２】
ジェネリックメッソド具体化方法において、
ランタイムにおいて、ジェネリックメソッドの呼出しにおいて表わされていない第一実型引数に基づいて、前記ジェネリックメソッドの呼出しの第二実型引数を決定し、尚前記呼出しは前記実型引数を特定するものではなく、
前記第二実型引数を表わすデータを発生し、
前記呼出しと前記データとの間の関連を確立する、
ことを包含している方法。
【請求項１３】
命令の１つ又はそれ以上のシーケンスを担持するコンピュータにより読取可能な媒体であって、前記命令は、１個又はそれ以上のプロセッサにより実行される場合に、前記１個又はそれ以上のプロセッサをして、
ランタイムにおける第一オブジェクトの利用に基づいて、前記第一オブジェクトがインスタンスであるジェネリック型の第一実型引数を決定し、
前記第一実型引数を表わすデータを発生し、
前記第一オブジェクトと前記データとの間の関連を確立する、
上記各ステップを実施させることを特徴とするコンピュータにより読取可能な媒体。
【請求項１４】
請求項１３において、前記第一実型引数を決定する場合に、更に、初期的に、前記第一実型引数が拘束型により拘束される不確定な型であることを確立することを包含しているコンピュータにより読取可能な媒体。
【請求項１５】
請求項１４において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、第二オブジェクトが前記第一オブジェクト内に挿入されたことを決定し、
前記第二オブジェクトが前記第一オブジェクト内に挿入されたことを決定することに応答して、
前記第二オブジェクトがインスタンスである特定の型を決定し、
前記特定の型及び前記拘束型の両方の最も特定的な上位型を決定し、
前記拘束型を前記最も特定的な上位型へアップデートする、
上記各ステップを実施する、
ことを包含しているコンピュータにより読取可能な媒体。
【請求項１６】
請求項１３において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリック型である第二オブジェクトを入力パラメータとして受付けるプログラマチックメソッドへパスされたことを決定し、
前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第一実型引数を前記第二実型引数へアップデートする、
ことを包含しているコンピュータにより読取可能な媒体。
【請求項１７】
請求項１３において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリックタイプである第二オブジェクトへ割当てられたことを決定し、
前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第一実型引数を前記第二実型引数へアップデートする、
ことを包含しているコンピュータにより読取可能な媒体。
【請求項１８】
請求項１３において、前記第一実型引数を決定する場合に、更に、初期的に、前記第一実型引数が第一上限型により拘束される不確定な型であることを確立することを包含しているコンピュータにより読取可能な媒体。
【請求項１９】
請求項１８において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリック型である第二オブジェクトを入力パラメータとして受付けるプログラマチックメソッドへパスされたことを決定し、
前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第二実型引数が第二上限型により拘束される不確定な型を特定するか否かを決定し、
前記第二実型引数が前記第二上限型により拘束される不確定な型を特定することを決定することに応答して、
前記第一上限型及び前記第二上限型の両方の最も特定的でない下位型を決定し、
前記第一上限型を前記最も特定的でない下位型へアップデートする、
上記各ステップを実施する、
ことを包含しているコンピュータにより読取可能な媒体。
【請求項２０】
請求項１８において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリックタイプである第二オブジェクトへ割当てられたことを決定し、
前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第二実型引数が第二上限型により拘束される不確定な型を特定するか否かを決定し、
前記第二実型引数が前記第二上限型により拘束される不確定な型を特定することを決定することに応答して、
前記第一上限型及び前記第二上限型の両方の最も特定的でない下位型を決定し、
前記第一上限型を前記最も特定的でない下位型へアップデートする、
上記各ステップを実施する、
ことを包含しているコンピュータにより読取可能な媒体。
【請求項２１】
請求項１３において、前記第一実型引数を決定する場合に、更に、初期的に、前記第一実型引数を第一下限型により拘束される不確定な型であることを確立することを包含しているコンピュータにより読取可能な媒体。
【請求項２２】
請求項２１において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリック型である第二オブジェクトを入力パラメータとして受付けるプログラマチックメソッドへパスされたことを決定し、
前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第二実型引数が第二下限型により拘束される不確定な型を特定するか否かを決定し、
前記第二実型引数が前記第二下限型により拘束される不確定な型を特定することを決定することに応答して、
前記第一下限型及び前記第二下限型の両方の最も特定的な上位型を決定し、
前記第一下限型を前記最も特定的な上位型であるようにアップデートする、
上記各ステップを実施する、
ことを包含しているコンピュータにより読取可能な媒体。
【請求項２３】
請求項２１において、前記第一実型引数を決定する場合に、更に、
ランタイムにおいて、前記第一オブジェクトが第二実型引数と関連しているジェネリックタイプのものである第二オブジェクトへ割当てられたことを決定し、
前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第二実型引数が第二下限型により拘束される不確定な型を特定するか否かを決定し、
前記第二実型引数が前記第二下限型により拘束される不確定な型を特定することを決定することに応答して、
前記第一下限型及び前記第二下限型の両方の最も特定的な上位型を決定し、
前記第一下限型を前記最も特定的な上位型であるようにアップデートする、
上記各ステップを実施する、
ことを包含しているコンピュータにより読取可能な媒体。
【請求項２４】
命令の１つ又はそれ以上のシーケンスを担持するコンピュータにより読取可能な媒体において、前記命令は、１つ又はそれ以上のプロセッサにより実行される場合に、前記１つ又はそれ以上のプロセッサをして、
ランタイムにおいて、ジェネリックメソッドの呼出しにおいて表わされていない第一実型引数に基づいて、前記ジェネリックメソッドの呼出しの第二実型引数を決定し、尚前記呼出しは前記実型引数を特定するものではなく、
前記第二実型引数を表わすデータを発生し、
前記呼出しと前記データとの間の関連を確立する、
上記各ステップを実施することを特徴とするコンピュータにより読取可能な媒体。
【請求項２５】
ランタイムにおいて第一オブジェクトの利用に基づいて、前記第一オブジェクトがインスタンスであるジェネリック型の第一実型引数を決定するメカニズム、
前記第一実型引数を表わすデータを発生するメカニズム、
前記第一オブジェクトと前記データとの間の関連を確立するメカニズム、
を有していることを特徴とする装置。
【請求項２６】
ランタイムにおいて、ジェネリックメソッドの呼出しにおいて表わされていない第一実型引数に基づいて、前記ジェネリックメソッドの呼出しの第二実型引数を決定するメカニズム、尚前記呼出しは前記実型引数を特定するものではなく、
前記第二実型引数を表わすデータを発生するメカニズム、
前記呼出しと前記データとの間の関連を確立するメカニズム、
を有していることを特徴とする装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はジェネリック型の具体化に関するものであって、更に詳細には、移行互換性を維持しながらジェネリック型を具体化する技術に関するものである。
【背景技術】
【０００２】
Ｊａｖａ開発キット（ＪＤＫ）は、Ｊａｖａプログラムを発生させるためのソフトウエア開発キットである。ＪＤＫバージョン１．５は、Ｊａｖａプログラミング言語に対して幾つかの拡張を導入させている。これらの拡張のうちの１つは「ジェネリック型」の導入である。
【０００３】
Ｊａｖａにおけるジェネリック型は、全く同じというわけではないが、Ｃ＋＋プログラミング言語におけるテンプレートに類似している。ジェネリック型は、ジェネリック型の使用を有益的なものとさせる事例の説明を介して最も容易に理解することが可能である。
【０００４】
Ｊａｖａのような強く型付けされた言語の構文規則に従って、変数のデータ型はその変数の宣言において表現されることとなっている。以下の宣言が例示的なものである。
【０００５】
【数１】
2006302285.tif 000003
【０００６】
上の宣言において、変数「ｘ」は「整数」型であることが宣言されている。従って、「ｘ」に対して「整数」クラス又はその下位型のインスタンスではないオブジェクトを割当てようとする試みは禁止されるべきであって、且つコンパイラーをして割当てにおいて何かが間違っていることをプログラマーに対して警告すべきである。
【０００７】
以下の宣言は幾分より洗練されており且つ知識を与えるものである。
【０００８】
【数２】
2006302285.tif 000004
【０００９】
上の宣言において、変数「ｍｙＩｎｔＬｉｓｔ」は型「Ｌｉｓｔ」のものであることが宣言されている。上の表現が評価されると、「ＬｉｎｋｅｄＬｉｓｔ（）」コンストラクターメソッドの呼出しを介して「ＬｉｎｋｅｄＬｉｓｔ」クラスの新たなインスタンス（即ち、「Ｌｉｎｋｅｄｌｉｓｔ」オブジェクト）が形成され（インスタンス化され）且つ「ｍｙＩｎｔＬｉｓｔ」へ割当てられる。「Ｌｉｓｔ」及び「ＬｉｎｋｅｄＬｉｓｔ」クラスは以下の説明において例として使用するが、以下に説明するクラスの挙動はこれらのクラスにのみ制限されるものでないことを理解すべきである。
【００１０】
型「Ｌｉｓｔ」のその他の変数のように、変数「ｍｙＩｎｔＬｉｓｔ」は「ＬｉｎｋｅｄＬｉｓｔ」オブジェクトを割当てることが可能である。「ＬｉｎｋｅｄＬｉｓｔ」オブジェクトは他のオブジェクトのリンクされたリストである。Ｊａｖａにおけるジェネリック型の導入前においては、コンパイラーはこれらの他のオブジェクトの特定の型が何であるかを決定することは不可能であった。型システムはランタイム挙動の保守的な近似であった。例えば、ジェネリック型がない場合には、「Ｆｏｏ」型オブジェクトがＬｉｎｋｅｄＬｉｓｔ内へ「挿入」だけでは、ＬｉｎｋｅｄＬｉｓｔからこれらのオブジェクトを「抽出」した場合に、コンパイラーはそのオブジェクトが型「Ｆｏｏ」であることを決定することは不可能である。ジェネリック型がない場合には、コンパイラーは、これらのオブジェクトが「Ｏｂｊｅｃｔ」クラスの何等かの不確定な下位型のインスタンスであることを決定することが可能であるに過ぎない。Ｊａｖａにおいては、全てのクラスが「Ｏｂｊｅｃｔ」クラスのサブタイプ即ち下位型である。これはコンパイラーが得ることが可能な特定の限界であるので、「抽出」されたオブジェクトは、それらに関して喚起された「Ｏｂｊｅｃｔ」クラス（「Ｆｏｏ」クラスに対して）のメソッドを有することが可能であるに過ぎない。
【００１１】
この欠点のために、特定のデータ型であると宣言された変数に対してそのオブジェクトを割当てる前に、このように戻されたオブジェクトを特定のデータ型へ「キャスト」することがプログラマーにとってしばしば必要となっていた。以下のコードはこのことを示している。
【００１２】
【数３】
2006302285.tif 000005
【００１３】
上のコードにおいて、メソッドにより戻された「Ｏｂｊｅｃｔ」型オブジェクトは型「Ｉｎｔｅｇｅｒ」の変数へ明示的にキャストされている。このキャストが実施されなかった場合には、非「Ｉｎｔｅｇｅｒ」型オブジェクトが型「Ｉｎｔｅｇｅｒ」の変数へ割当てられることをコンパイラーが注意する場合がある。全くこのような注意は有益的なものである。何故ならば、コンパイラーがこのような割当てについて注意を促さない場合には、コンパイルされたプログラムは、メソッドが実際に整数でないオブジェクトを戻した場合に、異外で且つ不所望の挙動を示す場合があるからである。
【００１４】
このようにオブジェクトをキャストせねばならないことは、通常、プログラマーを苛立たせ且つソースコードを不所望にくどいものであり且つ読みにくいものとさせる。キャストするということは「ダーティ」なプログラミング作業であると考えるような人がいるかもしれない。幸運なことに、Ｊａｖａにおけるジェネリック型の出現はキャストすることを不必要なものとさせ、少なくとも、上述した目的のためには不必要なものとさせている。ジェネリック型を組込んだサンプルの宣言は以下の如くである。
【００１５】
【数４】
2006302285.tif 000006
【００１６】
これは、「ｍｙＩｎｔＬｉｓｔ」へ割当てられたリンクされたリスト内のオブジェクトがクラス「Ｉｎｔｅｇｅｒ」のインスタンスであることをこの宣言が明示的に示していることを除いて、上の非ジェネリック型宣言に類似している。この宣言に鑑み、「ｍｙＩｎｔＬｉｓｔ．ｉｔｅｒａｔｏｒ（）．ｎｅｘｔ（）」メソッドにより戻される全てのオブジェクトが「Ｉｎｔｅｇｅｒ」オブジェクトであることをコンパイラーが知得する。コンパイラーは次の表現、
【００１７】
【数５】
2006302285.tif 000007
【００１８】
について不平を言うものではない。何故ならば、メソッドにより戻されるオブジェクトは「Ｉｎｔｅｇｅｒ」オブジェクトでなければならず且つ変数「ｘ」は型「Ｉｎｔｅｇｅｒ」のオブジェクトを参照することが可能であることをコンパイラーが決定することが可能だからである。単一の宣言が潜在的に多数のキャストを不必要なものとさせる。
【００１９】
更に注意すべきことであるが、そのクラスの多数の別々のインプリメンテーションを必要とすることなしに、ジェネリック型はこのような態様における特定性を可能とする。「ｍｙＩｎｔＬｉｓｔ」は「Ｉｎｔｅｇｅｒ」オブジェクトを参照する「Ｌｉｓｔ」オブジェクトであるが、「Ｉｎｔｅｇｅｒ」オブジェクトのみを参照するためにプログラマーが「Ｌｉｓｔ」クラスのインプリメンテーションを特定的にコード化することは必要ではない。ジェネリック型はクラスを一般的な態様で定義し、次いで異なる特定の宣言において複数回喚起させることを可能とする。
【００２０】
ジェネリック型が提供するランタイム挙動のより精密な近似のために、ジェネリック型は、又、ランタイム障害を回避することを助ける。ジェネリック型宣言の実際の例を以下に示してある。
【００２１】
【数６】
2006302285.tif 000008
【００２２】
上のジェネリック型宣言において、不等号で囲まれたパラメータ（例えば、「＜Ｅ＞」）はジェネリック型の「仮型パラメータ」と呼ばれる。このようなジェネリック型の特定の呼出しは「パラメータ化された型」と呼ばれる。例えば、以下の型表現はパラメータ化された型である。
【００２３】
【数７】
2006302285.tif 000009
【００２４】
前のパラメータ化された型において、「＜Ｉｎｔｅｇｅｒ＞」は「実型引数」の例である。パラメータ化された型は、ジェネリック型宣言が喚起される場合に、仮型パラメータの代わりに入れられるべき実型引数を特定する。
【００２５】
Ｊａｖａジェネリック型及びＣ＋＋テンプレートは構文的及び機能的に幾分類似しているが、これら２つの間には幾つかの顕著な差異が存在している。Ｊａｖａジェネリック型の宣言は、ソースコード内又はバイナリーコード内において、異なる実型引数に対する複数の異なる特定の宣言へ拡張されることはない。その代わりに、Ｊａｖａにおける非ジェネリック型宣言の場合のように、Ｊａｖａジェネリック型宣言は単一のクラスファイルへコンパイルされる。
【００２６】
ジェネリック型は非常に有用なものであるので、Ｊａｖａライブラリ内に従来から存在していた非ジェネリック型宣言の多くはジェネリック型宣言と置換されている。非ジェネリックメソッド宣言も、これらのライブラリにおいて、ジェネリックメソッド宣言と置換されている。換言すると、以前の非ジェネリック型及びメソッド宣言は「ジェネリック化」されている。新たなＪａｖａプログラムを書いているプログラマーは、そのプログラム内にパラメータ化した型を入れることによりジェネリック型及びメソッドを利用することが可能である。
【００２７】
然しながら、Ｊａｖａ言語は、既に、かなりの期間にわたって存在していたものであるから、多くのＪａｖａプログラムが既に書かれている。想像することが可能であるように、これらのプログラムの多くはパラメータ化された型を包含するものではない。その代わりに、これらのプログラムの多くは、実型引数を特定することのない呼出しを包含している。コンパイラーがジェネリック型宣言の全ての呼出しをパラメータ化された型であることを必要とする場合には（実型引数を特定することのない呼出しに対して）、既存のＪａｖａプログラムの多くは新たなＪａｖａライブラリと互換性のないものとなる。
【００２８】
上の問題を解消する１つの試みは、ジェネリック型宣言の全ての呼出しがジェネリック型宣言における各下位型パラメータに対し実型引数を特定するように既存のＪａｖａプログラムを修正することを必要とすることである。このような態様で非常に大きなプログラムを修正することは厄介な作業であり、実際に、プログラマーは、その代わりに、新たなＪａｖａライブラリ及びジェネリック型メカニズムを使用することを完全に諦めることを好む場合がある程厄介なものである。
【００２９】
上の問題を解決する別のアプローチは、その呼出しがジェネリック型宣言における仮型パラメータに対する実型引数を特定するものでないものであってもジェネリック型宣言の呼出しをプログラムが包含することをコンパイラーが許容するような態様でコンパイラーをインプリメント即ち実現することが関与する。ジェネリック型宣言における仮型パラメータに対する実型引数を特定することのないジェネリック型呼出しは「生の型」（このような実型引数を特定する「パラメータ化された型」と対比して）と呼ばれる。コンパイラーが生の型を参照する表現に遭遇すると、その表現の正しいことを保証することが不可能であることをコンパイラーが警告し、コンパイラーは生の型に関して型のチェックを実施することは不可能である。それにも拘わらず、コンパイラーはコンパイル作業が進行することを許容する。ランタイムにおいてその表現が不所望な効果を発生することがないことを確保することの責任はプログラマーに課されている。
【００３０】
Ｊａｖａランタイム環境は、伝統的に、インスタンス化されたオブジェクトに関するクラス情報をランタイムにおいて決定するためにプログラムが使用することが可能なランタイムデータ構造及びメカニズムを提供していた。例えば、「ｉｎｓｔａｎｃｅｏｆ」演算子を使用して、Ｊａｖａプログラムは、特定したオブジェクトが特定したクラスのインスタンスであるか否かを決定することが可能である。
【００３１】
然しながら、Ｊａｖａプログラムがコンパイルされると、パラメータ化された型において特定されている実型引数は結果的に得られるバイナリーファイル内において保存されるものではなく、このような引数は「消去」と呼ばれる処理において失われる。必ずしもその唯一の目的というわけではないが、消去は、生の型を包含するプログラムが、上述した如く、ジェネリック型宣言を包含するライブラリと相互作用を行うことを可能とする。消去を介して、パラメータ化された型のインスタンスのバイナリー表示は、対応する生の型のインスタンスのバイナリー表示と同一となる。これらのバイナリー表示は同一であるので、生の型を包含しているプログラムからコンパイルした古いバイナリーファイルは、ジェネリック型宣言を包含しているライブラリーからコンパイルした新しいバイナリーファイルとリンクさせることが可能である。
【００３２】
然しながら、消去の結果として、Ｊａｖａランタイム環境は、現在、パラメータ化された型のインスタンスであるオブジェクトに関しての何等かの特定の情報をプログラムが決定することを可能とする方法を有するものではない。
【００３３】
例えば、Ｊａｖａランタイム環境は、現在のところ、特定したオブジェクトが特定した実型引数を有するパラメータ化された型のインスタンスであるか否かをプログラムが決定することを可能とするものではない。Ｊａｖａランタイム環境は、その結果が、変数「ｘ」が一般的に型「Ｃｏｌｌｅｃｔｉｏｎ」の変数であるか否かに依存するある表現を正確に評価することが可能なものであるが、例えば、Ｊａｖａランタイム環境は、現在のところ、その結果が、変数「ｘ」が特定的に型「Ｃｏｌｌｅｃｔｉｏｎ＜Ｓｔｒｉｎｇ＞」の変数であるか否かに依存するある表現を正確に評価することは不可能である。例えソースコードが実型引数「＜Ｓｔｒｉｎｇ＞」でパラメータ化された型を最初に表わすものであっても、実型引数「＜Ｓｔｒｉｎｇ＞」は、プログラムがバイナリーファイルへコンパイルされる場合に消去されてしまう。
【００３４】
それにも拘わらず、前者の種類の表現を正確に評価することが可能なＪａｖａランタイム環境でもって長い間作業したプログラマーは、当然に、Ｊａｖａランタイム環境が後者の種類の表現を正確に評価することが可能であるベきことを期待している。
【発明の開示】
【発明が解決しようとする課題】
【００３５】
本発明は、以上の点に鑑みなされたものであって、上述した如き従来技術の欠点を解消し、改良したジェネリック型の具体化技術を提供することを目的とする。本発明の別の目的とするところは、移行互換性を維持しながらジェネリック型を具体化する技術を提供することである。
【課題を解決するための手段】
【００３６】
本発明の１実施例によれば、移行互換性を維持しながらジェネリック型を具体化する技術が提供される。この技術によれば、生の型と関連すべきであるがバイナリーファイルにおいて表現されていない実型パラメータがランタイムにおいて動的に推測される。生の型のインスタンスであるオブジェクトのランタイム使用に基づいて実型パラメータが推測される。
【００３７】
１実施例においては、特定のオブジェクトがインスタンスであるジェネリック型の実型引数がランタイムにおいてのオブジェクトの使用に基づいて動的に決定される。このことは、オブジェクトの呼出しが何等の実型引数を特定するものではない環境の下で発生し、例えば、その呼出しは「Ｌｉｓｔ  ｍｙＩｎｔＬｉｓｔ」である場合があり、それは「＜Ｉｎｔｅｇｅｒ＞」のような実型引数を欠如している。実型引数を表わすデータが発生される。特定のオブジェクトとそのデータとの間の関連が確立される。その結果、ランタイム環境は、特定のオブジェクトの型の実型引数がテストされるか又はその他の態様でプログラムにおいて必要とされる場合には、そのデータから特定のオブジェクトの型の実型引数を読取ることが可能である。
【００３８】
特定のオブジェクトの型の実型引数は種々の手段を使用して決定することが可能である。例えば、実型引数は、その特定のオブジェクト内に挿入された他のオブジェクトの型に基づいて決定することが可能である。別の例として、実型引数は、その特定のオブジェクトが入力としてパスされるメソッドのパラメータと関連している別の実型引数に基づいて決定することが可能である。別の例として、実型引数は、その特定のオブジェクトが割当てられた別のオブジェクトと関連している別の実型引数に基づいて決定することが可能である。
【００３９】
本明細書に記載する技術は、ジェネリック化したライブラリにおいて特定される全ての実型引数が、該ライブラリと生の型のみを包含するレガシーコード、即ちパラメータ化させた型を組込むために未だに「移行」されていないコードとの間の互換性を維持するためにコンパイル時において消去される環境下においても実型引数を動的に決定するために使用することが可能である。従って、本明細書に記載する技術は、移行互換性を維持しながらジェネリック型を具体化するために使用することが可能である。
【発明を実施するための最良の形態】
【００４０】
概観
本発明の１実施例によれば、ジェネリック型を具体化する技術が提供される。本発明の１実施例の動作のハイレベルな概観を例示するフローチャートを図１に示してある。
【００４１】
図１を参照すると、ブロック１０２において、オブジェクトがインスタンスであるジェネリック型の実型引数を決定する。その実型引数はランタイムにおいてのそのオブジェクトの使用に基づいて決定される。
【００４２】
例えば、Ｊａｖａ仮想マシン（ＪＶＭ）が生の型を包含するＪａｖａプログラムを稼動している場合がある。その生の型は何等実型引数（例えば、「Ｌｉｓｔ  ｍｙＩｎｔＬｉｓｔ」）を特定するものではないジェネリック型のインボケーション（ｉｎｖｏｃａｔｉｏｎ）即ち呼出しである。生の型のインスタンスであるオブジェクトがどのようにパスされ、割当てられ、及び／又はそのメソッドを喚起させるかに基づいて、ＪＶＭは、少なくとも部分的に、そのオブジェクトの型の実型引数を決定することが可能である。
【００４３】
例えば、オブジェクト「ｍｙＩｎｔＬｉｓｔ」がメソッド「ｃｏｕｎｔ（Ｃｏｌｌｅｃｔｉｏｎ＜Ｎｕｍｂｅｒ＞ｃ）」へのパラメータとしてパスされると、ＪＶＭは、このことから、そのオブジェクトの「Ｌｉｓｔ」型の実型パラメータが「Ｎｕｍｂｅｒ」又はそのサブタイプ即ち下位型であることを決定することが可能であり、換言すると、ＪＶＭは、「ｍｙＩｎｔＬｉｓｔ」がジェネリック型「Ｌｉｓｔ＜Ｎｕｍｂｅｒ＞」のインスタンスであることを決定することが可能である。
【００４４】
ブロック１０４において、実型引数を表わすデータが発生される。例えば、ＪＶＭは、「＜Ｎｕｍｂｅｒ＞」の実型引数を表わすデータを発生することが可能である。
【００４５】
ブロック１０６において、そのオブジェクトとそのデータとの間の関連が確立される。例えば、ＪＶＭは、オブジェクト「ｍｙＩｎｔＬｉｓｔ」と実型パラメータ「＜Ｎｕｍｂｅｒ＞」との間の関連をランタイムデータ構造内に格納することが可能である。その後、ＪＶＭは、例えば「ｉｎｓｔａｎｃｅｏｆ」演算子又はキャストを包含する表現において、オブジェクト「ｍｙＩｎｔＬｉｓｔ」のジェネリック型がテストされる場合にその関連を参照することが可能である。ＪＶＭは、例えば割当て等のオブジェクトが関与するその他の表現が合法なものであるか否かを決定するためにその関連を参照することが可能である。
【００４６】
その他の側面において、本発明は、ある実施例においては、コンピュータ装置、コンピューティングシステム、及び前述した技術のうちの１つ又はそれ以上を実施すべく形態とされたコンピュータにより読取可能な媒体を包含している。
【００４７】
実型引数の動的推測
図２Ａ及び２Ｂは、本発明の１実施例に基づいて、ランタイムにおいてジェネリック型に対する実型引数を決定するための技術を例示するフローチャートである。例えば、ＪＶＭはランタイムにおいてこのような技術を実施することが可能である。本技術のステップは説明の便宜上特定の順番にあるものとして示してあるが、本技術のステップはこの例に示した特定の順番以外の順番で実施することが可能である。
【００４８】
図２Ａを参照すると、ブロック２０２において、「＜［Ｔｍａｘ］？ｓｕｐｅｒ［Ｌ］ｅｘｔｅｎｄｓ［Ｕ］＞」の形態の実型引数が生の型のインスタンスであるオブジェクト「Ｏ」と関連している。実型引数において、値「Ｔｍａｘ」、「Ｌ」、「Ｕ」は実型引数の境界を拘束すべく機能し、その実型引数は、その実型引数における「ワイルドカード」パラメータ「？」により示されるように不確定な型のものである。
【００４９】
「Ｌ」はその実型引数の下界型を示しており、これはその不確定な型があり得るべき最も特定の型である。「Ｕ」はその実型引数の上界型を示しており、これはその不確定な型があり得るべき最も一般的な型である。「Ｔｍａｘ」はオブジェクト「Ｏ」内に挿入されているその他のオブジェクトの最も一般的な型を示している。以下に説明するように、拘束条件「Ｔｍａｘ」、「Ｌ」、「Ｕ」の全ては、該オブジェクトの使用に基づいてランタイムで洗練化させることが可能である。このランタイム洗練化処理を介して、オブジェクト「Ｏ」のジェネリック型の実型引数はより確かなものとされ、その実型引数の境界は「厳しくなる」場合がある。
【００５０】
通常、「Ｌ」の初期値は「Ｎｕｌｌ」であり、且つ「Ｕ」の初期値は「Ｏｂｊｅｃｔ」である。従って、通常、不確かな型「？」は、初期的に、非常に特定的な「Ｎｕｌｌ」から非常に一般的な「Ｏｂｊｅｃｔ」の範囲にわたる任意の型とすることが可能である。「Ｔｍａｘ」の初期値も「Ｎｕｌｌ」であり、何故ならば、未だにオブジェクト「Ｏ」内にオブジェクトが挿入されていないからである。
【００５１】
ブロック２０４に対する各アクセスは、ＪＶＭがプログラムを実行する処理において別の命令を読取ることに対応している場合がある。
【００５２】
ブロック２０４において、別のオブジェクト「Ｑ」がオブジェクト「Ｏ」内に挿入されたか否かが決定される。例えば、プログラムの稼動中において、ＪＶＭは、プログラムにおける現在の命令が１つのオブジェクトをオブジェクト「Ｏ」内に挿入させる命令であるか否かを決定する場合がある。通常、このような挿入はオブジェクト「Ｏ」の特定の挿入メソッドを介して達成される。例えば、その挿入命令は「Ｏ．ａｄｄ（Ｑ）」の形態をとる場合があり、その場合に、「Ｑ」は「ａｄｄ」メソッドが「Ｏ」内に挿入する別のオブジェクトである。別のオブジェクトがオブジェクト「Ｏ」内に挿入されると、制御はブロック２０６へパスする。そうでない場合には、制御はブロック２１２へパスする。
【００５３】
ブロック２０６において、オブジェクト「Ｑ」のタイプが上界型「Ｕ」のスーパータイプ即ち上位型であるか否かが決定される。そうである場合には、制御がブロック２０８へパスする。そうでない場合には、制御はブロック２１０へパスする。
【００５４】
ブロック２０８において、ランタイムエラーが表示される。例えば、ＪＶＭがプログラムの実行を停止させ且つエラーが発生したことを表示する場合がある。「Ｕ」の上位型のインスタンスは上界として「Ｕ」を有する実型引数を有するジェネリック型のインスタンス内に挿入することは不可能である。例えば、「Ｑ」が型「Ｏｂｊｅｃｔ」のものであり、且つ「Ｏ」がその上界が「Ｎｕｍｂｅｒ」であるジェネリック型のものである場合には、「Ｑ」は「Ｏ」内に挿入することは不可能である。数のコレクション即ち集まりは、数ではないオブジェクトを包含することは不可能である。
【００５５】
一方、ブロック２１０において、「Ｔｍａｘ」は、オブジェクト「Ｑ」の型及び「Ｔｍａｘ」の現在値の両方の最小上界であるようにアップデートされる。これら２つの型の最小上界は両方の型の最も特定的な上位型である。例えば、オブジェクト「Ｑ」の型が「Ｆｌｏａｔ」であり且つ「Ｔｍａｘ」の現在値が「Ｄｏｕｂｌｅ」である場合には、これら２つの最小上界は「Ｎｕｍｂｅｒ」である。この場合には、「Ｔｍａｘ」の値は「Ｎｕｍｂｅｒ」と等しいようにアップデートされる。「Ｏｂｊｅｃｔ」も「Ｆｌｏａｔ」及び「Ｎｕｍｂｅｒ」の両方の上位型であるが、「Ｏｂｊｅｃｔ」は「Ｎｕｍｂｅｒ」ほど特定的ではない。制御はブロック２０４へ戻る。
【００５６】
一方、ブロック２１２において「Ｏ」が、特定した実型引数を有するジェネリック型のものであるオブジェクトをパラメータとして受付けるメソッドへのパラメータとしてパスされたか否かが決定される。例えば、プログラムの稼動中に、ＪＶＭは、そのプログラムにおける現在の命令がオブジェクト「Ｏ」をして、そのパラメータが特定した実型引数を有するジェネリック型のものであるオブジェクトであることを予測するメソッドへのパラメータとしてパスさせる命令であるか否かを決定する場合がある。
【００５７】
例えば、その命令は「ｃｏｕｎｔ（Ｏ）」の形態にある場合があり、その場合に、メソッド「ｃｏｕｎｔ」の以前の宣言は「Ｉｎｔｅｇｅｒ  ｃｏｕｎｔ（Ｃｏｌｌｅｃｔｉｏｎ＜Ｎｕｍｂｅｒ＞）」であった。この例において、メソッド（ｃｏｕｎｔ）は、特定した実型引数「＜Ｎｕｍｂｅｒ＞」を有するジェネリック型（特に、「Ｃｏｌｌｅｃｔｉｏｎ」又はその下位型）のものであるオブジェクトをパラメータとして受取ることを期待している。オブジェクト「Ｏ」がこのようなメソッドへパスされると、制御は図２Ｂにおけるブロック２１４へパスする。そうでない場合には、制御はブロック２１３へパスする。
【００５８】
ブロック２１３において、オブジェクト「Ｏ」が、特定した実型引数を有しているジェネリック型である別のオブジェクト「Ｑ」へ割当てられているか否かが決定される。例えば、プログラムの稼動中に、ＪＶＭは、そのプログラムにおける現在の命令が、オブジェクト「Ｏ」をして、特定した実型引数を有するジェネリック型であるオブジェクトへ割当てさせる命令であるか否かを決定する場合がある。
【００５９】
例えば、その命令は「Ｑ＝Ｏ」の形態にある場合があり、その場合に、オブジェクト「Ｑ」の以前の宣言は「Ｃｏｌｌｅｃｔｉｏｎ＜Ｎｕｍｂｅｒ＞Ｑ」であった。この例において、オブジェクト「Ｑ」は特定した実型引数「＜Ｎｕｍｂｅｒ＞」を有しているジェネリック型（特に、「Ｃｏｌｌｅｃｔｉｏｎ」）のものである。オブジェクト「Ｏ」がこのようなオブジェクトへ割当てられていると、制御は図２Ｂにおけるブロック２１４へパスする。そうでない場合には、制御はブロック２０４へ戻る。
【００６０】
１実施例において、ブロック２１２及び２１３に関連して説明した特定した実型引数が３つの形態のうちの１つをとる場合がある。図２Ｂを参照すると、ブロック２１４において、特定した実型引数が「＜［Ｔ］＞」、「＜？ｅｘｔｅｎｄｓ［Ｔ］＞」、又は「＜？ｓｕｐｅｒ［Ｔ］＞」のいずれの形態にあるかが決定される。換言すると、特定した実型引数はある型、特定した上界を具備するある型、又は特定した下界を具備するある型であるか否かが決定される。その特定した実型引数が「＜［Ｔ］＞」の形態にある場合には、制御はブロック２１６へパスする。その特定した実型引数が「＜？ｅｘｔｅｎｄｓ［Ｔ］＞」の形態にある場合には、制御はブロック２２６へパスする。その特定した実型引数が「＜？ｓｕｐｅｒ［Ｔ］＞」の形態にある場合には、制御はブロック２３２へパスする。
【００６１】
ブロック２１６において、拘束型「Ｔｍａｘ」が「Ｔ」の同一の型又は下位型のいずれであるかが決定される。「Ｔｍａｘ」が「Ｔ」の同一の型又は下位型のいずれかである場合には、制御はブロック２２０へパスする。そうでない場合には、制御はブロック２１８へパスする。
【００６２】
ブロック２１８において、ランタイムエラーが表示される。例えば、ＪＶＭはそのプログラムの実行を停止し且つエラーが発生したことを表示する場合がある。
【００６３】
一方、ブロック２２０において、「Ｔ」が下界型「Ｌ」の同一の型又は下位型のいずれかであるかが決定される。「Ｔ」が「Ｌ」の同一の型又は下位型のいずれかである場合には、制御はブロック２２２へパスする。そうでない場合には、制御はブロック２１８へ戻る。
【００６４】
ブロック２２２において、「Ｔ」が上界型「Ｕ」の同一の型又は下位型のいずれかであるかが決定される。「Ｔ」が「Ｕ」の同一の型又は下位型のいずれかである場合には、制御はブロック２２４へパスする。そうでない場合には、制御はブロック２１８へ戻る。
【００６５】
ブロック２２４において、オブジェクト「Ｏ」と関連している実型引数が「＜［Ｔｍａｘ］？ｓｕｐｅｒ［Ｌ］ｅｘｔｅｎｄｓ［Ｕ］＞」から「＜［Ｔ］＞」へアップデートされる。この点において、オブジェクト「Ｏ」のジェネリック型の実型引数は確定している。例えば、「Ｏ」が生の型「Ｃｏｌｌｅｃｔｉｏｎ」のインスタンスであるとして宣言され、且つ「Ｔ」が「＜Ｎｕｍｂｅｒ＞」であると、その実型引数を包含する「Ｏ」のパラメータ化された型は「Ｃｏｌｌｅｃｔｉｏｎ＜Ｎｕｍｂｅｒ＞」となる。その実型引数を更に洗練化されるための試みは必要ではない。
【００６６】
一方、その特定した実型引数が「＜？ｅｘｔｅｎｄｓ［Ｔ］＞」の形態にある場合には、ブロック２２６において、拘束型「Ｔｍａｘ」が「Ｔ」の同一の型又は下位型のいずれかであるかが決定される。「Ｔｍａｘ」が「Ｔ」の同一の型又は下位型のいずれかである場合には、制御はブロック２２８へパスする。そうでない場合には、制御はブロック２１８へパスする。
【００６７】
ブロック２２８において、「Ｔ」が下界型「Ｌ」の同一の型又は下位型のいずれかであるかが決定される。「Ｔ」が「Ｌ」の同一の型又は下位型のいずれかである場合には、制御はブロック２３０へパスする。そうでない場合には、制御はブロック２１８へ戻る。
【００６８】
ブロック２３０において、「Ｕ」が「Ｔ」と「Ｕ」の現在値の両方の最大下界であるようにアップデートされる。換言すると、「Ｕ」は「Ｔ」及び「Ｕ」の両方の最も特定的でない下位型であるようにアップデートされる。制御は図２Ａにおけるブロック２０４へ戻る。
【００６９】
一方、その特定した実型引数が「＜？ｓｕｐｅｒ［Ｔ］＞」の形態にある場合には、ブロック２３２において、「Ｔ」が上界型「Ｕ」の同一の型又は下位型のいずれかであるかが決定される。「Ｔ」が「Ｕ」の同一の型又は下位型のいずれかである場合には、制御はブロック２３４へパスする。そうでない場合には、制御はブロック２１８へ戻る。
【００７０】
ブロック２３４において、「Ｌ」が「Ｔ」及び「Ｌ」の現在値の両方の最小上界であるようにアップデートされる。換言すると、「Ｌ」は「Ｔ」及び「Ｌ」の両方の最も特定的な上位型であるようにアップデートされる。制御は図２Ａにおけるブロック２０４へ戻る。
【００７１】
従って、オブジェクト「Ｏ」がインスタンスであるジェネリック型の実型パラメータは、ランタイムにおいて、次第に且つ動的に推測され且つ洗練化される。
【００７２】
ジェネリックメソッド
クラスは、仮型パラメータと関連することが可能な唯一のプログラマチックエンティティではない。メソッドも仮型パラメータと関連することが可能である。以下のコードを例として考察する。
【００７３】
【数８】
2006302285.tif 000010
【００７４】
上のコードは仮型パラメータ「Ｅ」を有するジェネリックメソッドを表わしている。レガシーコードは、例えば、
【００７５】
【数９】
2006302285.tif 000011
【００７６】
のようなメソッドのジェネリックの前のバージョンの呼出しを包含している場合がある。
【００７７】
このような呼出しは「生の」呼出しと呼ばれる場合がある。何故ならば、その呼出しはジェネリックメソッド宣言における仮型パラメータにとって代わるべき実型パラメータを特定するものではないからである。本明細書に記載する技術を使用して、実型パラメータは使用に基づいてランタイムで推測することが可能である。
【００７８】
例えば、実型パラメータに関する何等かの情報はメソッドへパスされるオブジェクトの型から推測することが可能である。上の例において、オブジェクト「ｄ」がメソッド「ａｄｄａｌｌ（）」へのパラメータとしてパスされる。オブジェクト「ｄ」のジェネリック型が「Ｃｏｌｌｅｃｔｉｏｎ＜Ｓｔｒｉｎｇ＞」（「Ｃｏｌｌｅｃｔｉｏｎ＜Ｓｔｒｉｎｇ＞ｄ；」のような先の呼出しから決定することが可能であるように）である場合には、メソッド「ａｄｄａｌｌ（）」の生の呼出しの実型パラメータは、少なくとも、「ｓｔｒｉｎｇ」型を包含するのに充分に広いものであることを推測することが可能である。
【００７９】
１実施例においては、ジェネリックメソッドの各「生の」呼出しは別の実型パラメータと関連している。初期的には、「生の」呼出しと関連している実型パラメータは「＜［Ｘ］ｓｕｐｅｒ［Ｌ］ｅｘｔｅｎｄｓ［Ｕ］＞」である。ジェネリック型に関して上述したのと同様の態様において、実型パラメータにおける拘束型「Ｘ」、「Ｌ」、「Ｕ」は使用に基づいてランタイムでアップデートし且つ洗練化させることが可能である。
【００８０】
ハードウエア概観
図３は本発明の１実施例を実現することが可能なコンピュータシステム３００を例示したブロック図である。コンピュータシステム３００は、情報交換を簡単化するためのバス３０２、及び情報を処理するためにバス３０２と結合されている１個又はそれ以上のプロセッサ３０４を包含している。コンピュータシステム３００は、又、プロセッサ３０４に実行されるべき命令及び情報を格納するためにバス３０２と結合されている例えばランダムアクセスメモリ（ＲＡＭ）又はその他のダイナミック記憶装置等のメインメモリ３０６を包含している。メインメモリ３０６は、又、プロセッサ３０４による命令の実行期間中に一次的な変数又はその他の中間情報を格納するために使用することが可能である。コンピュータシステム３００は、更に、プロセッサ３０４に対する静的情報及び命令を格納するためにバス３０２へ結合されているリードオンリメモリ（ＲＯＭ）３０８又はその他のスタチック記録装置を包含することが可能である。磁気ディスク又は光学ディスク等の格納装置３１０が設けられており且つ情報及び命令を格納するためにバス３０２へ結合されている。
【００８１】
コンピュータシステム３００は、コンピュータユーザに対して情報を表示するために、陰極線管（ＣＲＴ）等のディスプレイ３１２へバス３０２を介して結合させることが可能である。英文字又はその他のキーを包含する入力装置３１４が情報及びコマンド選択をプロセッサ３０４に対して通信するためにバス３０２へ結合されている。別のタイプのユーザ入力装置は、方向情報及びコマンド選択をプロセッサ３０４へ通信し且つディスプレイ３１２上のカーソルの運動を制御するためのマウス、トラックボール又はカーソル方向キー等のカーソル制御３１６である。この入力装置は、典型的に、第一軸（例えば、ｘ）及び第二軸（例えば、ｙ）の２つの軸における自由度２を有しており、それは該装置が面内における位置を特定することを可能とする。
【００８２】
コンピュータシステム３００において、バス３０２は種々のコンポーネントの間で情報、信号、データ等を交換させることを可能とする任意のメカニズム及び／又は媒体とすることが可能である。例えば、バス３０２は電気信号を担持する１組の導体とすることが可能である。バス３０２は、又、コンポーネントのうちの１つ又はそれ以上の間でワイヤレス信号を担持するワイヤレス媒体（例えば、空気）とすることも可能である。バス３０２は、又、コンポーネントのうちの１つ又はそれ以上の間で信号を容量的に交換することを可能とさせる媒体（例えば、空気）とすることが可能である。バス３０２は、更に、コンポーネントのうちの１つ又はそれ以上を接続するネットワーク接続とすることが可能である。一般的に、種々のコンポーネントの間で情報、信号、データ等を交換させることを可能とする任意のメカニズム及び／又は媒体をバス３０２として使用することが可能である。
【００８３】
バス３０２は、又、これらのメカニズム／媒体の結合とすることも可能である。例えば、プロセッサ３０４はワイヤレスによって格納装置３１０と通信することが可能である。このような場合には、バス３０２は、プロセッサ３０４及び格納装置３１０の観点から、空気のようなワイヤレス媒体である。更に、プロセッサ３０４は容量的にＲＯＭ３０８と通信することが可能である。この場合には、バス３０２はこの容量的通信が行われることを可能とする媒体（例えば、空気）である。更に、プロセッサ３０４はネットワーク接続を介してメインメモリ３０６と通信することが可能である。この場合には、バス３０２はネットワーク接続である。更に、プロセッサ３０４は１組の導体を介してディスプレイ３１２と通信することが可能である。この場合には、バス３０２は１組の導体である。従って、どのようにして種々のコンポーネントが互いに通信するかに依存して、バス３０２は異なる形態をとることが可能である。図３に示したように、バス３０２は、種々のコンポーネントの間で情報、信号、データ等を交換することを可能とするメカニズム及び／又は媒体の全てを機能的に表わしている。
【００８４】
本発明は、本明細書に記載した技術を実現するためのコンピュータシステム３００の使用に関連している。本発明の１実施例によれば、これらの技術は、メインメモリ３０６内に包含されている１個又はそれ以上の命令の１個又はそれ以上のシーケンスを実行するプロセッサ３０４に応答してコンピュータシステム３００により実施される。このような命令は、格納装置３１０等の別の機械読取可能な媒体からメインメモリ３０６内に読込むことが可能である。メインメモリ３０６内に包含されている命令のシーケンスの実行は、プロセッサ３０４をして、本明細書に記載する処理ステップを実施させる。別の実施例においては、本発明を実現するためのソフトウエア命令の代わりに又はそれと組み合わせてハードワイヤード回路を使用することが可能である。従って、本発明の実施例はハードウエア回路及びソフトウエアのいずれかの特定の結合に制限されるものではない。
【００８５】
本明細書において使用される「機械読取可能な媒体」という用語は、マシンをして特定の態様で動作させるデータを供給することに関与する任意の媒体のことを意味している。コンピュータシステム３００を使用して実現される実施例において、種々の機械読取可能な媒体が、例えば、実行のためにプロセッサ３０４へ命令を供給する場合に関与する。このような媒体は、これらに制限されるものではないが、非揮発性媒体、揮発性媒体、伝送媒体を包含する多くの形態を取ることが可能である。非揮発性媒体は、例えば、格納装置３１０のような光学的又は磁気的ディスクを包含している。揮発性媒体は、メインメモリ３０６のようなダイナミックメモリを包含している。伝送媒体は、バス３０２を有するワイヤを包含する同軸ケーブル、銅ワイヤ及びオプティカルファイバを包含している。伝送媒体は、又、電波及び赤外線データ通信期間中に発生されるもののような音響的又は光波の形態をとることも可能である。
【００８６】
機械読取可能な媒体の一般的な形態は、例えば、フロッピィディスク、フレキシブルディスク、ハードディスク、磁気テープ、又は任意のその他の磁気媒体、ＣＤ−ＲＯＭ、任意のその他の光学的媒体、パンチカード、孔のパターンを有する任意のその他の物理的媒体、ＲＡＭ、ＰＲＯＭ、ＥＰＲＯＭ、フラッシュＥＰＲＯＭ、任意のその他のメモリチップ又はカートリッジ、後述するような搬送波、又はそれからコンピュータが読取ることが可能な任意のその他の媒体を包含している。
【００８７】
種々の形態の機械読取可能な媒体は、実行のためにプロセッサ３０４に対して１個又はそれ以上の命令の１個又はそれ以上のシーケンスを担持する場合に関与する場合がある。例えば、その命令は初期的には遠隔コンピュータの磁気ディスク上に担持されている場合がある。その遠隔コンピュータは該命令をそのダイナミックメモリ内にロードし且つその命令をモデムを使用して電話線を介して送信することが可能である。コンピュータシステム３００に対してローカルなモデムは電話線を介してそのデータを受取り且つそのデータを赤外線信号へ変換させるために赤外線送信機を使用することが可能である。赤外線検知器がその赤外線信号内に担持されるデータを受取ることが可能であり、且つ適宜の回路がそのデータをバス３０２上に配置させることが可能である。バス３０２はそのデータをメインメモリ３０６へ運び、そこからプロセッサ３０４がその命令を検索し且つ実行する。メインメモリ３０６により受取られた命令は、オプションとして、プロセッサ３０４による実行の前又は後のいずれかにおいて格納装置３１０上に格納させることが可能である。
【００８８】
コンピュータシステム３００は、又、バス３０２へ結合されている通信インターフェース３１８を包含している。通信インターフェース３１８はローカルネットワーク３２２へ接続されているネットワークリンク３２０に対する二方向データ通信結合を提供している。例えば、通信インターフェース３１８は、対応するタイプの電話線に対するデータ通信接続を提供するためのインテグレイテッドサービスデジタルネットワーク（ＩＳＤＮ）カード又はモデムとすることが可能である。別の例としては、通信インターフェース３１８は、互換性のあるＬＡＮに対するデータ通信接続を提供するためのローカルエリアネットワーク（ＬＡＮ）カードとすることが可能である。ワイヤレスリンクを実現することも可能である。いずれかのこのような実現例において、通信インターフェース３１８は種々のタイプの情報を表わすデジタルデータストリームを担持する電気的、電磁的又は光学的信号を送信し且つ受取る。
【００８９】
ネットワークリンク３２０は、典型的に、１つ又はそれ以上のネットワークを介して他のデータ装置に対するデータ通信を提供する。例えば、ネットワークリンク３２０は、ホストコンピュータ３２４に対して又はインターネットサービスプロバイダ（ＩＳＰ）３２６により運営されているデータ装置に対しローカルネットワーク３２２を介しての接続を提供することが可能である。ＩＳＰ３２６は、現在「インターネット」３２８として一般的に呼ばれているワールドワイドパケットデータ通信ネットワークを介してデータ通信サービスを提供する。ローカルネットワーク３２２及びインターネット３２８は、両方共、デジタルデータストリームを担持する電気的、電磁的又は光学的信号を使用する。ネットワークリンク３２０上の種々のネットワーク及び信号を介して及びコンピュータシステム３００への及びそれからのデジタルデータを担持する通信インターフェース３１８を介しての信号は情報を移送する搬送波の例示的な形態である。
【００９０】
コンピュータシステム３００はネットワーク、ネットワークリンク３２０及び通信インターフェース３１８を介してプログラムコードを包含するデータ及びメッセージを送り且つ受取ることが可能である。インターネットの例においては、サーバー３３０はインターネット３２８、ＩＳＰ３２６、ローカルネットワーク３２２、通信インターフェース３１８を介して、アプリケーションプログラムに対して要求されたコードを送信する場合がある。
【００９１】
受取ったコードは、それが受取られるとプロセッサ３０４により実行され、及び／又は後に実行するために格納装置３１０、又はその他の非揮発性格納装置内に格納することが可能である。このように、コンピュータシステム３００は搬送波の形態でアプリケーションコードを得ることが可能である。
【００９２】
前述した説明においては、本発明の実施例をインプリメンテーション毎に異なる場合のある多数の特定の詳細を参照して説明した。以上、本発明の具体的実施の態様について詳細に説明したが、本発明は、これら具体例にのみ制限されるべきものではなく、本発明の技術的範囲を逸脱することなしに種々の変形が可能であることは勿論である。
【図面の簡単な説明】
【００９３】
【図１】本発明の１実施例の動作の概観を例示したフローチャート。
【図２Ａ】本発明の１実施例に基づいてランタイムにおいてジェネリック型に対する実型引数を決定するためのプロセスの一部を示したフローチャート。
【図２Ｂ】図２Ａと結合されるべき同一のプロセスの残りの部分を示したフローチャート。
【図３】本発明の１実施例の１個又はそれ以上のコンポーネントを実現するために使用することが可能な例示的なコンピュータシステムを示したブロック図。
【符号の説明】
【００９４】
３００  コンピュータシステム
３０２  バス
３１８  通信インターフェース
３２０  ネットワークリンク
３２２  ローカルネットワーク
３２４  ホストコンピュータ
３２６  インターネットサービスプロバイダ（ＩＳＰ）
３２８  インターネット
【図１】
2006302285.tif 000012
【図２Ａ】
2006302285.tif 000013
【図２Ｂ】
2006302285.tif 000014
【図３】
2006302285.tif 000015