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