JP2007012064A - 非ジェネリック化方法がジェネリック化方法をオーバーライドすることの許可 - Google Patents
非ジェネリック化方法がジェネリック化方法をオーバーライドすることの許可 Download PDFInfo
- Publication number
- JP2007012064A JP2007012064A JP2006178136A JP2006178136A JP2007012064A JP 2007012064 A JP2007012064 A JP 2007012064A JP 2006178136 A JP2006178136 A JP 2006178136A JP 2006178136 A JP2006178136 A JP 2006178136A JP 2007012064 A JP2007012064 A JP 2007012064A
- Authority
- JP
- Japan
- Prior art keywords
- type
- return type
- signature
- return
- parameters
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims description 343
- 230000008030 elimination Effects 0.000 claims description 10
- 238000003379 elimination reaction Methods 0.000 claims description 10
- 230000008569 process Effects 0.000 claims description 10
- 230000007246 mechanism Effects 0.000 claims description 9
- 230000004044 response Effects 0.000 claims description 8
- 238000006243 chemical reaction Methods 0.000 claims description 6
- 238000012217 deletion Methods 0.000 claims description 2
- 230000037430 deletion Effects 0.000 claims description 2
- 238000004891 communication Methods 0.000 description 17
- 230000003287 optical effect Effects 0.000 description 5
- 230000006399 behavior Effects 0.000 description 4
- 230000005540 biological transmission Effects 0.000 description 3
- 239000004020 conductor Substances 0.000 description 3
- 238000005266 casting Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 239000011800 void material Substances 0.000 description 2
- RYGMFSIKBFXOCR-UHFFFAOYSA-N Copper Chemical compound [Cu] RYGMFSIKBFXOCR-UHFFFAOYSA-N 0.000 description 1
- 206010016275 Fear Diseases 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 239000000969 carrier Substances 0.000 description 1
- 229910052802 copper Inorganic materials 0.000 description 1
- 239000010949 copper Substances 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 230000007257 malfunction Effects 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
- G06F9/4491—Optimising based on receiver type
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Measuring Or Testing Involving Enzymes Or Micro-Organisms (AREA)
- Medicines Containing Antibodies Or Antigens For Use As Internal Diagnostic Agents (AREA)
Abstract
【課題】 オブジェクト指向型プログラミングにおいてジェネリック型の採用を促進させる技術を提供する。
【解決手段】 本発明の1実施例によれば、例え第一メソッドのパラメータの型が第二メソッドのパラメータの型と異なる場合であっても、且つ例え第一メソッドの戻り型が第二メソッドの戻り型と異なる場合であっても、特定した基準が満足される限り、第一メソッドが第二メソッドをオーバーライドすることを許容する技術が提供される。この技術の結果、ジェネリック戻り型及び/又はジェネリック型パラメータを有するものでない古いメソッドが、ジェネリック戻り型及び/又はジェネリック型パラメータを有するものでなかったが現在は有しているメソッドを継続してオーバーライドすることを可能とする。
【選択図】 図1
【解決手段】 本発明の1実施例によれば、例え第一メソッドのパラメータの型が第二メソッドのパラメータの型と異なる場合であっても、且つ例え第一メソッドの戻り型が第二メソッドの戻り型と異なる場合であっても、特定した基準が満足される限り、第一メソッドが第二メソッドをオーバーライドすることを許容する技術が提供される。この技術の結果、ジェネリック戻り型及び/又はジェネリック型パラメータを有するものでない古いメソッドが、ジェネリック戻り型及び/又はジェネリック型パラメータを有するものでなかったが現在は有しているメソッドを継続してオーバーライドすることを可能とする。
【選択図】 図1
Description
本発明は、オブジェクト指向型プログラミングにおけるジェネリック技術に関するものであって、更に詳細には、特定の基準が満足される場合に第一メソッドが第二メソッドをオーバーライドすることを可能とする技術に関するものである。
ジャバ(Java)開発キット(JDK)は、ジャバプログラムを生成するためのソフトウエア開発キットである。JDKバージョン1.5はジャバプログラミング言語(以後、「Java」(ジャバ)と呼称する)に対し幾つかの拡張を導入している。これらの拡張のうちの1つは「ジェネリック型(generic type)」の導入である。
ジャバにおけるジェネリック型は、全く同一というわけではないが、C++プログラミング言語におけるテンプレートと類似している。ジェネリック型は、ジェネリック型の使用を有益的なものとさせるシナリオの説明を介して最も良く理解することが可能であると思われる。
ジャバのような強く型付けされたプログラミング言語の構文的規則に従って、変数のデータ型はその変数の制限において表現されているものと仮定されている。以下の宣言が例示的なものである。
上の宣言において、変数「x」は型「Integer」のものであると宣言されている。従って、「x」に対して「Integer」クラス又はサブクラスのインスタンスではないオブジェクトを割当てようとする試みは禁止されるべきであり且つコンパイラーをしてその割り当てにおいて何かが間違っていることをプログラマーに対して警告させるべきである。
次の宣言は幾分より洗練化されており且つ情報を提供するものである。
上の宣言において、変数「myIntList」は型「List」のものであると宣言されている。上の表現が評価されると、「LinkedList」クラスの新たなインスタンス(即ち、「LinkedList」オブジェクト)が「LinkedList()」コンストラクターメソッドの呼出しを介して作成され(インスタンス化され)且つ「myIntList」へ割当てられる。「List」及び「LinkedList」クラスが以下の説明における例として使用されるが、以下に説明するクラスの挙動はこれらのクラスにのみ制限されるべきものでないことを理解すべきである。
特定の型の変数はその特定の型のサブタイプ(subtype)即ち下位型のものであるオブジェクトを割当てることが可能である。型「List」のその他の変数のように、変数「myIntList」は「LinkedList」オブジェクトを割当てることが可能である。何故ならば、型「LinkedList」は型「List」の下位型だからである。「LinkedList」オブジェクトはその他のオブジェクトのリンクされたリストである。ジャバの中にジェネリック型を導入する前に、コンパイラーは、これらのその他のオブジェクトの特定の型が何であったかを決定することは不可能である。型システムはランタイム挙動の保守的な近似である。例えば、ジェネリック型がない場合には、「Foo」型オブジェクトがLinkedList内へ「挿入」される場合には、コンパイラーは、LinkedListからこれらのオブジェクトを「抽出」した時に、該オブジェクトが型「Foo」のものであることを決定することは不可能である。ジェネリック型がない場合には、コンパイラーは、これらのオブジェクトが「Object」クラスの何等かの不確定な下位型のインスタンスであったことを決定することが可能であるに過ぎず、ジャバにおいては、全てのクラスが「Object」クラスのサブクラスである。これはコンパイラーが得ることができる特定性の限界であるから、「抽出された」オブジェクトはそれらに関して呼び出された「Object」クラス(「Foo」クラスと対比して)のメソッドを有することが可能であるに過ぎない。
この欠点のために、そのオブジェクトを特定のデータ型のものであると宣言された変数へ割当てる前に、プログラマーがこのような戻されたオブジェクトを特定のデータ型へ「キャスト」することが必要であることがしばしばであった。以下のコードはそのことを示している。
上のコードにおいて、該メソッドにより戻される「Object」型オブジェクトはクラス「Integer」のインスタンスに明示的にキャストされる。このキャストが実施されなかった場合には、非「Integer」型オブジェクトが型「Integer」の変数へ割当てられているということをコンパイラーが非難する場合がある。正に、このような非難は有益的なものである。何故ならば、コンパイラーがこのような割当てに対して非難しない場合には、メソッドが実際にはInteger即ち整数ではないオブジェクトを戻すか又は戻した場合にコンパイルされたプログラムが予測せず且つ不所望の挙動を示す場合があるからである。
このようにオブジェクトをキャストすることの必要性は、通常、プログラマーをいらいらさせ且つソースコードを不所望にくどいものとさせ且つ読みにくいものとさせる。キャストすることは「ダーティ」即ち汚いプログラミング手法であると考える者もいる。ジャバにおけるジェネリック型の出現はキャストすることを不必要なものとさせ、少なくとも上述した目的のためにはそうである。ジェネリック型を組込んだサンプルの宣言は以下のようなものである。
これは、この宣言が、「myIntList」へ割当てられているLinkedList内のオブジェクトがクラス「Integer」のインスタンスとなるということを明示的に示していることを除いて、上述した非ジェネリック型の宣言と類似している。この宣言に鑑み、「myIntList.iterator().next()」メソッドにより戻される全てのオブジェクトは「Integer」オブジェクトであることをコンパイラーが知得する。コンパイラーは次式の表現を非難することはない。
何故ならば、メソッドにより戻されるオブジェクトは「Integer」オブジェクトでなければならないこと、及び変数「x」は型「Integer」のオブジェクトを参照することが可能であることをコンパイラーが決定することが可能だからである。単一の宣言が潜在的な多数のキャストを不必要なものとさせる。
更に注意すべきであるが、ジェネリック型は、クラスの複数の別々のインプリメンテーション(implementation)即ち実装を必要とすることなしにこのような態様における特定性を可能とさせる。「myIntList」は「Integer」オブジェクトを参照する「List」オブジェクトであるが、「Integer」オブジェクトのみを参照するためにプログラマーが「List」クラスのインプリメンテーション即ち実装を特定的にコードすることは必要ではない。ジェネリック型は一度ジェネリック態様でクラスを定義することを可能とし、次いで異なる特定的な宣言において複数回呼び出すことが可能である。
ジェネリック型が提供するランタイム挙動のより精密な近似に起因して、ジェネリック型は、又、ランタイム障害を回避することに貢献する。
ジェネリック型宣言の実際の例を以下に示す。
上のジェネリック型宣言において、山型括弧で取囲まれたパラメータ(例えば、「<E>」)はジェネリック型の「仮型パラメータ」と呼ばれる。このようなジェネリック型の特定の呼出しは「パラメータ化された型」と呼ばれる。例えば、以下の表現はパラメータ化された型である。
上のパラメータ化された型において、<Integer>は「実型引数」の例である。パラメータ化された型は、ジェネリック型宣言が呼び出される場合に、仮型パラメータの代わりに入れられるべき実型引数を特定する。
ジャバジェネリック型及びC++テンプレートは構文的に及び機能的に幾分類似しているが、両者の間には幾つかの顕著な差異が存在している。ジャバジェネリック型の宣言は、ソースコード内においても又バイナリーコード内においても、異なる実型引数に対する複数個の異なる特定の宣言に拡張されることはない。その代わりに、ジャバにおける非ジェネリック型宣言の場合におけるように、ジャバジェネリック型宣言は単一のクラスファイルにコンパイルされる。
ジェネリック型は非常に有用なものであるので、ジャバライブラリ内に存在していた非ジェネリック型宣言の多くはジェネリック型宣言で置換されている。非ジェネリックメソッド宣言もジェネリックメソッド宣言でこれらのライブラリ内において置換されている。換言すると、以前の非ジェネリック型及びメソッド宣言は「ジェネリック化」されている。新たなジャバプルグラムを書いているプログラマーはプログラムの中にパラメータ化された型を入れ込むことによりジェネリック型及びメソッドを利用することが可能である。
生の型及び消去
ジャバ言語はかなりの期間の間既に存在しているので、多くのジャバプログラムが既に書かれている。想像することが可能であるように、これらのプログラムの多くはパラメータ化された型を包含するものではない。その代わりに、これらのプログラムの多くは実型引数を特定することのない呼出しを包含している。コンパイラーが、ジェネリック型宣言の全ての呼出しがパラメータ化された型であることを必要とする場合には(実型引数を特定することのない呼出しと対比して)、既存のジャバプログラムの多くは新たなジャバライブラリと互換性のないものとなる。
ジャバ言語はかなりの期間の間既に存在しているので、多くのジャバプログラムが既に書かれている。想像することが可能であるように、これらのプログラムの多くはパラメータ化された型を包含するものではない。その代わりに、これらのプログラムの多くは実型引数を特定することのない呼出しを包含している。コンパイラーが、ジェネリック型宣言の全ての呼出しがパラメータ化された型であることを必要とする場合には(実型引数を特定することのない呼出しと対比して)、既存のジャバプログラムの多くは新たなジャバライブラリと互換性のないものとなる。
上の問題を解決するための1つの試みは、ジェネリック型宣言の全ての呼出しがジェネリック型宣言における各仮型パラメータに対して実型引数を特定するように既存のジャバプログラムを修正することを必要とすることである。このようにして非常に大きなプログラムを修正することは厄介な作業であり、実際に、その代わりにプログラマーは新たなジャバライブラリ及びジェネリック型メカニズムを使用することを完全に諦めることを好むような程厄介なものである。
上の問題を解決するための別のアプローチは、例えこれらの呼出しがジェネリック型宣言における仮型パラメータに対する実型引数を特定するものではないものであってもコンパイラーはプログラムがジェネリック型宣言の呼出しを包含することを許容するような態様でコンパイラーを実現させることが関与する。ジェネリック型宣言における仮型パラメータに対する実型引数を特定することのないジェネリック型呼出しは「生の型」と呼ばれる(このような実型引数を特定する「パラメータ化された型」に対して)。コンパイラーが生の型を参照する表現に遭遇すると、コンパイラーは、表現の正確性を保証することができないことを警告し、コンパイラーは生の型に関して型検査を実施することは不可能である。然しながら、コンパイラーはコンパイルが進行することを許容する。その表現がランタイムにおいて不所望な結果を発生することがないことを確保するための負担はプログラマーに負わされている。
後方互換性を維持するために、ジャバプログラムがコンパイルされると、パラメータ化された型において特定されている実型引数は結果的に発生するバイナリーファイル内に保存されることはなく、このような引数は「消去」と呼ばれるプロセスにおいて失われる。必ずしもその唯一の目的というわけではないが、消去は生の型を包含するプログラムが、上述した如く、ジェネリック型宣言を包含するライブラリと相互運用することを許容する。消去を介して、パラメータ化された型のインスタンスのバイナリー表現は対応する生の型のインスタンスのバイナリー表現と同一となる。これらのバイナリー表現は同一であるので、生の型を包含していたプログラムからコンパイルされた古いバイナリーファイルは、ジェネリック型宣言を包含していたライブラリからコンパイルされた新しいバイナリーファイルとリンクさせることが可能である。
継承及びオーバーライド
継承は殆どのオブジェクト指向型プログラミングシステムの主要な特性である。継承の場合には、あるクラスがスーパークラスのサブクラスとして宣言されている場合には、そのサブクラスはそのスーパークラスのメソッド及び属性の全てを自動的に受け継ぐ。従って、クラスAがメソッドM1と属性AT1とを有している場合には、クラスAのサブクラスであるクラスBは、メソッドM1と属性AT1とを自動的に受け継ぐ。スーパークラスのメソッド及び属性を受け継ぐことに加えて、サブクラスは、更に、付加的なメソッドと属性とを有することが可能である。従って、上に与えた例の場合には、クラスBは更にメソッドM2及びM3と属性AT2及びAT3を有することが可能である。
継承は殆どのオブジェクト指向型プログラミングシステムの主要な特性である。継承の場合には、あるクラスがスーパークラスのサブクラスとして宣言されている場合には、そのサブクラスはそのスーパークラスのメソッド及び属性の全てを自動的に受け継ぐ。従って、クラスAがメソッドM1と属性AT1とを有している場合には、クラスAのサブクラスであるクラスBは、メソッドM1と属性AT1とを自動的に受け継ぐ。スーパークラスのメソッド及び属性を受け継ぐことに加えて、サブクラスは、更に、付加的なメソッドと属性とを有することが可能である。従って、上に与えた例の場合には、クラスBは更にメソッドM2及びM3と属性AT2及びAT3を有することが可能である。
メソッド及び属性を受け継ぎ且つ付加することに加えて、幾つかのオブジェクト指向型システムは、更に、サブクラスがスーパークラスのメソッドをオーバーライドすることを可能とさせる。即ち、そのサブクラスはスーパークラスにより与えられるものとは異なるインプリメンテーション即ち実装を受け継いだメソッドに与えることが許される。このことは、上に与えた例の場合には、サブクラスBが、スーパークラスAにより与えられるものとは異なるインプリメンテーション即ち実装をメソッドM1に対して与える場合があることを意味している。例えば、スーパークラスAにより与えられるM1に対するインプリメンテーション即ち実装は正方形を描画する場合があり、一方サブクラスBにより与えられるメソッドM1に対するインプリメンテーション即ち実装は円を描くことである。従って、両方のメソッドは同一の名前を有しているが、それらは異なるインプリメンテーション即ち実装を有する場合がある。どのインプリメンテーション即ち実装が呼び出されるかはそのメソッドが呼び出されるオブジェクトインスタンスのクラスに依存する。そのメソッドがクラスAインスタンスに関し呼び出される場合には、クラスAにより与えられるインプリメンテーションが呼び出される。そのメソッドがクラスBインスタンスに関して呼び出される場合には、クラスBにより与えられるインプリメンテーションが呼び出される。任意の特定のメソッドに対し複数のインプリメンテーションが存在する場合があるので、どのインプリメンテーションを呼び出すかについての決定をランタイムにおいて行わねばならない。ランタイムにおいてどのインプリメンテーションを呼び出すかの選択プロセスは動的メソッドディスパッチと呼称される。
現在のところ、サブクラスBにおけるメソッドM1がスーパークラスAにおけるメソッドM1と同一の名前及びシグネチャを有している場合には、ジャバコンパイラーは、クラスBがメソッドM1をオーバーライドせんとしているものと決定する(シグネチャについては以下により詳細に説明する)。これらのメソッドの名前とシグネチャとが同じであるが、それらのメソッドのパラメータの型が異なる場合には、コンパイラーは、サブクラスBにおけるM1はスーパークラスAにおけるM1とは別個のメソッドであるとみなし、コンパイラーは、オーバーライドの試みがなされないことを結論する。以下の例は例示的なものである。
上の例において、クラスはジェネリックでなく、そのメソッドのパラメータの型もそうである。両方の「toList()」メソッドのパラメータの型は同一である(「コレクション(Collection)」)。従って、コンパイラーは、サブクラス「Overrider」が「toList()」メソッドをオーバーライドすることを可能とさせる。
プログラムにおいて上のクラスが広範に書かれ且つ使用された後に、「CollectionConverter」クラスの著者は改善したジェネリック型メカニズムを使用することを所望する場合がある。従って、その著者は以下の如くに「CollectionConverter」クラスの宣言を少なくとも部分的にジェネリック化する場合がある。
クラスを修正した後に、そのクラスを包含するコードはその修正が何等かの効果を有するためには再コンパイルすることが必要である。スーパークラス「CollectionConverter」の新たなバージョンにおけるメソッド「toList()」の名前はサブクラス「Overrider」におけるメソッド「toList()」の名前と同じである。然しながら、サブクラス「Overrider」におけるメソッド「toList()」のパラメータの型はスーパークラス「CollectionConverter」におけるメソッド「toList()」パラメータの型と一致せず、型「Collection」は型「Collection<T>」と同じではない。従って、コンパイラーは、サブクラス「Overrider」が「toList()」メソッドをオーバーライドせんとしているものと結論することはない。サブクラス「Overrider」を包含するコードは、スーパークラス「CollectionConverter」の修正前においてはそのコードが正しく動作していたかもしれないが、コンパイルした場合には誤動作する場合がある。
多くの既存の非ジェネリックサブクラスは既存の非ジェネリックスーパークラスのメソッドをオーバーライドする場合がある。このような非ジェネリックスーパークラスの著者はそのスーパークラスのメソッドをジェネリック化することを嫌がる場合がある。何故ならば、スーパークラスのメソッドをジェネリック化することはそのスーパークラスのサブクラスを包含する既存のコードのコンパイルを阻止する場合があるからである。しばしば、スーパークラスの著者はそのスーパークラスのメソッドをオーバーライドするサブクラスを包含するコードに関し制御を有するものではないか又はそのことに気が付きさえしない場合があり、例えば、そのスーパークラスが他の者へ配布されているライブラリ内にある場合には、そのスーパークラスの著者は、そのスーパークラスのメソッド及びそのスーパークラスから受け継いだサブクラスのメソッドの全ての両方をジェネリック化することが不可能な場合がある。
ジェネリック型の採用を促進させるためには、非ジェネリックメソッドを有する非ジェネリックサブクラスがジェネリック型のものであるパラメータを有するメソッドをオーバーライドすることを可能とする技術が必要とされる。
本発明は、以上の点に鑑みなされたものであって、上述した如き従来技術の欠点を解消し、非ジェネリックメソッドがジェネリックメソッドをオーバーライドすることを可能とする技術を提供することを目的とする。
本発明の1実施例によれば、第一メソッドのパラメータの型が第二メソッドのパラメータの型と異なる場合であっても、且つ第一メソッドの戻り型が第二メソッドの戻り型と異なる場合であっても、特定された基準が満足される限り、第一メソッドが第二メソッドをオーバーライドすることを可能とする技術が提供される。この技術の結果として、ジェネリック戻り型及び/又はジェネリック型パラメータを有するものではない古いメソッドが、ジェネリック戻り型及び/又はジェネリック型パラメータを有するものではなかったが今や有しているメソッドを継続してオーバーライドすることが可能である。
本発明の1実施例によれば、上述した特定された基準は、推定上のオーバーライドするメソッドと推定上のオーバーライドされるメソッドの「シグネチャ」が同一であるか、又は推定上のオーバーライドされるメソッドのシグネチャの消去が推定上のオーバーライドするメソッドのシグネチャと同一であるかのいずれかであるという基準を包含している。シグネチャについては後に詳細に説明する。
概観
本発明の1実施例によれば、例え第一メソッドのパラメータの型が第二メソッドのパラメータの型と異なる場合であっても、及び例え第一メソッドの戻り型が第二メソッドの戻り型と異なるものであっても、特定した基準が満足される限り、第一メソッドが第二メソッドをオーバーライドすることを可能とする技術が提供される。本発明の1実施例の動作のハイレベルでの概観を例示したフローチャートを図1に示してある。本発明の実施例をクラスのメソッドを参照して以下に説明するが、本発明の実施例は、又、インターフェースを包含するその他のオブジェクト指向型プログラミング構造のメソッドに適用可能である。
本発明の1実施例によれば、例え第一メソッドのパラメータの型が第二メソッドのパラメータの型と異なる場合であっても、及び例え第一メソッドの戻り型が第二メソッドの戻り型と異なるものであっても、特定した基準が満足される限り、第一メソッドが第二メソッドをオーバーライドすることを可能とする技術が提供される。本発明の1実施例の動作のハイレベルでの概観を例示したフローチャートを図1に示してある。本発明の実施例をクラスのメソッドを参照して以下に説明するが、本発明の実施例は、又、インターフェースを包含するその他のオブジェクト指向型プログラミング構造のメソッドに適用可能である。
図1を参照すると、ブロック102において、サブクラス内において宣言されたメソッドがそのサブクラスが受け継いだスーパークラス内において宣言されているメソッドと同一の名前を有しているか否か、即ちそのサブクラスがそのスーパークラス「のサブクラス」であるか否かが決定される。例えば、コンパイラーは、プログラムをコンパイルしている間のコンパイル時にこのような決定を行うことが可能である。それらのメソッドの名前が同一である場合には、制御はブロック106へパスする。そうでない場合には、制御はブロック104へパスする。
ブロック104において、そのサブクラスのメソッドはそのスーパークラスのメソッドをオーバーライドすることはない。メソッドのオーバーライドはこれら2つのメソッドに関しては互いに問題ではなく、従ってコンパイラーはプログラムのコンパイルを進行することが可能である。
一方、ブロック106において、そのサブクラスのメソッドの仮パラメータの型がそのスーパークラスのメソッドの対応する仮パラメータの型と同一であるか否かが決定される。これら2つのメソッドが同数の仮パラメータを有するものではない場合には、それらメソッドの仮パラメータの型は同一のものであることは不可能である。ジェネリック型は対応する生の型と同一であるとは考えられず、従って、1つのメソッドの仮パラメータが生の型「List」であり且つ他方のメソッドの対応する仮パラメータがジェネリック型「List<Integer>」のものである場合には、これらメソッドの対応する仮パラメータの型は同じものではない。対応する仮パラメータの型が同じである場合には、制御はブロック110へパスする。そうでない場合には、制御はブロック108へパスする。
ブロック108において、そのサブクラスのメソッドの「シグネチャ」がそのスーパークラスのメソッドの「シグネチャ」の消去と同じであるか否かが決定される。メソッドの「シグネチャ」の定義について以下により詳細に説明する。本発明のある実施例の前に、それらのメソッドの対応するパラメータが異なる型のものである場合にはサブクラスのメソッドはスーパークラスのメソッドをオーバーライドすることは不可能であり、この場合には、メソッドのシグネチャは同じではない。この規則は非ジェネリックメソッドがジェネリック化されたメソッドをオーバーライドすることを阻止していた。
然しながら、本発明の1実施例によれば、サブクラスのメソッドのシグネチャがスーパークラスのメソッドのシグネチャの消去と同じである場合には、それらのメソッドのシグネチャが例え異なる場合であっても、そのサブクラスのメソッドがそのスーパークラスのメソッドをオーバーライドすることが尚且つ可能なものである。ある環境下において、この改定された規則は、あるメソッドの非ジェネリックバージョンが同じメソッドのジェネリックバージョンをオーバーライドすることを可能とする。従って、プログラマーは彼等のコードをジェネリック化させることが促され、且つそうすることが、他の者の従属性のコードをしてジェネリック化に起因して互換性のないものとさせるという恐れを取除いている。サブクラスのメソッドの「シグネチャ」がスーパークラスのメソッドの「シグネチャ」の消去と同じである場合には、制御はブロック110へパスする。そうでない場合には、制御はブロック122へパスする。
ブロック110において、サブクラスのメソッドの戻り型がスーパークラスのメソッドの戻り型と同じであるか否かが決定される。この場合も、ジェネリック型は対応する生の型と同じであるとは考えられない。これらのメソッドの戻り型が同じである場合には、制御はブロック114へパスする。そうでない場合には、制御はブロック112へパスする。
ブロック112において、サブクラスのメソッドの戻り型がスーパークラスのメソッドの戻り型に対する「return−type−substitutable」(戻り型置換可能)であるか否かが決定される。「return−type−substitutable」の定義については以下により詳細に説明する。本発明のある実施例の前に、これらのメソッドが異なる戻り型を有している場合には、サブクラスのメソッドはスーパークラスのメソッドをオーバーライドすることは不可能である。この規則は、時折、非ジェネリックメソッドがジェネリック化されたメソッドをオーバーライドすることを阻止していた。
然しながら、本発明の1実施例によれば、サブクラスのメソッドのシグネチャの戻り型がスーパークラスのメソッドの戻り型に対する「return−type−substitutable」である場合には、これらのメソッドの戻り型が異なる場合であっても、そのサブクラスのメソッドがそのスーパークラスのメソッドをオーバーライドすることは尚且つ可能である。ある環境下において、この改定された規則はあるメソッドの非ジェネリックバージョンが同じメソッドのジェネリックバージョンをオーバーライドすることを可能とする。
サブクラスのメソッドの戻り型がスーパークラスのメソッドの戻り型に対するreturn−type−substitutableである場合には、制御はブロック114へパスする。そうでない場合には、制御はブロック122へパスする。
ブロック114において、そのスーパークラスのメソッドが、「public」又は「protected」アクセスを有するものとしてスーパークラスの宣言において宣言されたか否かが決定される。そのスーパークラスのメソッドがこのようなアクセスを有するべく宣言されている場合には、制御はブロック120へパスする。そうでない場合には、制御はブロック116へパスする。
ブロック116において、そのスーパークラスがそのサブクラスと同一のパッケージ内にあるか否かが決定される。そのスーパークラスがそのサブクラスと同一のパッケージ内にある場合には、制御はブロック120へパスする。このような環境下において、そのスーパークラスのメソッドは、例えば、デフォルトのアクセスを有することを宣言することが可能である。そのスーパークラスがそのサブクラスと同一のパッケージ内にない場合には、制御はブロック118へパスする。
ブロック118において、そのサブクラスのメソッドがそのスーパークラスのメソッドをオーバーライドする別のメソッドをオーバーライドするか否かが決定される。換言すると、そのサブクラスのメソッドが「transitive method override(遷移的メソッドオーバーライド)」に起因してそのスーパークラスのメソッドをオーバーライドすることが可能であるか否かが決定される。遷移的メソッドオーバーライドは米国特許第6,725,280号、米国特許第6,687,760号、米国特許第6,687,759号において詳細に説明されており、尚、これらの米国特許の記載内容全体を、あたかも本明細書において元々開示されていたかのように引用により本明細書に取込む。そのサブクラスのメソッドが、そのスーパークラスのメソッドをオーバーライドする別のメソッドをオーバーライドする場合には、制御はブロック120へパスする。そうでない場合には、制御はブロック122へパスする。
ブロック120において、そのサブクラスのメソッドはそのスーパークラスのメソッドをオーバーライドすることが許容される。上述したように、このことは、それらのメソッドが同一のシグネチャを有するものでない場合であってもそうである。コンパイラーは、そのプログラムのコンパイルを進行することが可能である。
一方、ブロック122において、そのサブクラスのメソッドはそのスーパークラスのメソッドをオーバーライドすることは許容されない。
その他の側面において、本発明は、ある実施例においては、コンピュータ装置、コンピュータシステム、及び前述した技術を実施すべく構成されているコンピュータにより読取可能な媒体を包含している。
2つのメソッドのシグネチャが同じであるか否かを決定する技術について以下に説明する。2つの戻り型が戻り型置換可能であるか否かを決定する技術についても以下に説明する。
メソッドシグネチャ
上述したように、サブクラスのメソッドは、ある基準が満足される場合には、スーパークラスのメソッドをオーバーライドすることが可能である。本発明の1実施例によれば、これらの基準のうちの少なくとも1つは、そのサブクラスのメソッドのシグネチャが、そのスーパークラスのメソッドのシグネチャ又はそのスーパークラスのメソッドのシグナチャの消去と同じであることを必要とするということである。本発明の1実施例によれば、特定のメソッドのシグネチャの「消去」はその特定のメソッドのシグネチャと同じであり、その場合に、その特定のメソッドの仮パラメータの型及びその特定のメソッドの戻り型を包含するすべてのジェネリック型は対応する生の型で置換されている(例えば、「List<Integer>」は「List」で置換されている)。
上述したように、サブクラスのメソッドは、ある基準が満足される場合には、スーパークラスのメソッドをオーバーライドすることが可能である。本発明の1実施例によれば、これらの基準のうちの少なくとも1つは、そのサブクラスのメソッドのシグネチャが、そのスーパークラスのメソッドのシグネチャ又はそのスーパークラスのメソッドのシグナチャの消去と同じであることを必要とするということである。本発明の1実施例によれば、特定のメソッドのシグネチャの「消去」はその特定のメソッドのシグネチャと同じであり、その場合に、その特定のメソッドの仮パラメータの型及びその特定のメソッドの戻り型を包含するすべてのジェネリック型は対応する生の型で置換されている(例えば、「List<Integer>」は「List」で置換されている)。
本発明の1実施例によれば、特定のメソッドのシグネチャは、その特定のメソッドの名前、その特定のメソッドの仮パラメータの引数型、及びその特定のメソッドの型パラメータの境界を包含している。本発明の1実施例によれば、2つのメソッドが同じ名前と同じ引数型とを有している場合には、それらのメソッドは同じシグネチャを有している。本発明の1実施例によれば、以下の全てが真である場合には、同じ引数型を有している。
・それらのメソッドが同数の仮パラメータを有している(それはゼロである場合がある)。
・それらのメソッドが同数の型パラメータを有している(それはゼロである場合がある)。
・<A1,...,An>が1つのメソッドの仮型パラメータであるとし且つ<B1,...,Bn>が他方のメソッドの仮型パラメータであるとし、1からnのiの全ての値に対しBiをAiへ名前を代えた後に、対応する型変数の境界及び該メソッドの引数型は同じである。
メソッドM2がメソッドM1と同じシグネチャを有しているか、又はメソッドM1のシグネチャがメソッドM1のシグネチャの消去と同じである場合には、メソッドM1のシグネチャはメソッドM2のシグネチャの「subsignature」即ちサブシグネチャと呼ばれる。従って、本発明の1実施例によれば、サブクラスのメソッドのシグネチャがスーパークラスのメソッドのシグネチャのサブシグネチャでない限り、そのサブクラスのメソッドはそのスーパークラスのメソッドをオーバーライドすることが許容されない。本発明のこのような実施例においては、サブクラスのシグネチャがスーパークラスのシグネチャと正確に同じでない場合であっても、全てのその他の特定した基準が満足される限りサブクラスのメソッドはスーパークラスのメソッドをオーバーライドすることが許容される場合があり、シグネチャにおける差異のみがメソッドのオーバーライドを阻止するものではない。
例えば、サブクラス(「Overrider」)のコード化の後のある時にスーパークラス(「CollectionConverter」)のジェネリック化の結果として以下のスーパークラスとサブクラスとがコード中に存在する場合がある。
上の例において、スーパークラスの「toList()」メソッドはジェネリック型であるが、サブクラスの「toList()」はそうではない。「toList()」メソッドのパラメータの型は同一ではない。「toList()」メソッドのも戻り型は同一ではない。これらの差異にも拘わらず、そのサブクラスは今だにそのスーパークラスをオーバーライドすることが可能である。コンパイラーはその差異に応答して終局的なエラーを発行することは必要ではなく、サブクラス「Overrider」を包含するコードは、「Overrider」がコード化された後にスーパークラス「CollectionConverter」の「toList()」メソッドがジェネリック化されたとしても、未だに成功裡にコンパイルすることが可能である。
戻り型置換可能性
上述したように、ある基準が満足される場合には、サブクラスのメソッドがスーパークラスのメソッドをオーバーライドすることが可能である。本発明の1実施例によれば、これらの基準のうちの少なくとも1つは、そのサブクラスのメソッドの戻り型がそのスーパークラスのメソッドの戻り型と同じであることを必要とするが、又はそのサブクラスのメソッドの戻り型がそのスーパークラスのメソッドの戻り型に対する「return−type−substitutable」であることを必要とするかのいずれかである。
上述したように、ある基準が満足される場合には、サブクラスのメソッドがスーパークラスのメソッドをオーバーライドすることが可能である。本発明の1実施例によれば、これらの基準のうちの少なくとも1つは、そのサブクラスのメソッドの戻り型がそのスーパークラスのメソッドの戻り型と同じであることを必要とするが、又はそのサブクラスのメソッドの戻り型がそのスーパークラスのメソッドの戻り型に対する「return−type−substitutable」であることを必要とするかのいずれかである。
図2は、本発明の1実施例に基づいて、サブクラスのメソッドの戻り型がスーパークラスのメソッドの戻り型に対する「return−type−substitutable」であるか否かを決定する例示的な技術を例示するフローチャートである。コンパイラーは、例えば、コンパイル時にその技術を実施することが可能である。
図2を参照すると、ブロック202において、サブクラスのメソッドの戻り型がプリミティブ型であるか否かが決定される。サブクラスのメソッドの戻り型がプリミティブ型である場合には、制御はブロック204へパスする。そのサブクラスのメソッドの戻り型がプリミティブ型ではない場合には、そのサブクラスのメソッドの戻り型は基準型であり、且つ制御はブロック206へパスする。
そのサブクラスのメソッドの戻り型がプリミティブ型である場合には、ブロック204において、そのサブクラスのメソッドの戻り型がそのスーパークラスのメソッドの戻り型と同一であるか否かが決定される。それらの戻り型が同一である場合には、制御はブロック214へパスする。そうでない場合には、制御はブロック216へパスする。
一方、そのサブクラスのメソッドの戻り型が基準型である場合には、ブロック206において、そのサブクラスのメソッドのシグネチャがスーパークラスのメソッドのシグネチャと同じであるか否かが決定される。メソッドシグネチャは上に説明した。これらのシグネチャが同じである場合には、制御はブロック208へパスする。そうでない場合には、制御はブロック212へパスする。
それらのメソッドのシグネチャが同じである場合には、ブロック208において、サブクラスのメソッドの戻り型がスーパークラスのメソッドの戻り型の下位型であるか否かが決定される。全ての型は「Object」の下位型であり、従ってそのスーパークラスのメソッドの戻り型が「Object」である場合には、そのサブクラスのメソッドの戻り型はそのスーパークラスのメソッドの戻り型の下位型である。そのサブクラスのメソッドの戻り型がそのスーパークラスのメソッドの戻り型の下位型である場合には、制御はブロック214へパスする。そうでない場合には、制御はブロック210へパスする。
ブロック210において、そのサブクラスのメソッドの戻り型を無検査変換プロセスを介してそのスーパークラスのメソッドの戻り型の下位型へ変換させることが可能であるか否かが決定される。本発明の1実施例によれば、そのサブクラスのメソッドの戻り型が(a)そのスーパークラスのメソッドの戻り型の消去と同じであるか、又は(b)そのスーパークラスのメソッドの戻り型の消去の下位型である場合には、そのサブクラスのメソッドの戻り型は無検査変換プロセスを介してそのスーパークラスのメソッドの戻り型の下位型へ変換させることが可能である。そのサブクラスのメソッドの戻り型を無検査変換プロセスを介してそのスーパークラスのメソッドの戻り型の下位型へ変換させることが可能である場合には、制御はブロック214へパスする。そうでない場合には、制御はブロック216へパスする。
一方、それらのメソッドのシグネチャが同じでない場合には、ブロック212において、そのサブクラスのメソッドの戻り型がそのスーパークラスのメソッドの戻り型の消去の下位型であるか否かが決定される。そのサブクラスのメソッドの戻り型がそのスーパークラスのメソッドの戻り型の消去の下位型である場合には、制御はブロック214へパスする。そうでない場合には、制御はブロック215へパスする。
ブロック214において、そのサブクラスのメソッドの戻り型はそのスーパークラスのメソッドの戻り型に対するreturn−type−substitutable即ち戻り型置換可能であると考えられる。その他の基準が満足される場合には、2つの間の何等かの差異にも拘わらず、そのサブクラスのメソッドはそのスーパークラスのメソッドをオーバーライドすることが許容される場合がある。従って、メソッドの戻り型が異なる場合であってもサブクラスのメソッドはスーパークラスのメソッドをオーバーライドすることが許容される場合がある。
一方、ブロック216において、そのサブクラスのメソッドの戻り型はそのスーパークラスのメソッドの戻り型に対するreturn−type−substitutable即ち戻り型置換可能ではないと考えられる。戻り型における差異は、コンパイラーをして、そのサブクラスのメソッドがそのスーパークラスのメソッドをオーバーライドすることを阻止させる。コンパイラーはエラーを発行し且つコンパイル作業を終了させることが可能である。
本発明の1実施例によれば、そのサブクラスのメソッドの戻り型がそのスーパークラスのメソッドの戻り型の下位型でない場合には、無検査警告が発行される。コンパイラーはこのような警告を発行することが可能である。このような警告はコンパイル作業を停止するものではないが、コンパイル中のプログラムにおいて何かが間違っている場合があることをユーザに警告する。
本発明の1実施例によれば、そのサブクラスのメソッドの戻り型又はそのスーパークラスのメソッドの戻り型が「void」であり且つその他のクラスのメソッドの戻り型が「void」でない場合には、エラーが発行され且つコンパイル作業が終了される。
ハードウエア概観
図3は本発明の1実施例を実現することが可能なコンピュータシステム300を例示したブロック図である。コンピュータシステム300は、情報交換を簡単化させるためのバス302、及び情報を処理するためにバス302と結合されている1個又はそれ以上のプロセッサ304を包含している。コンピュータシステム300は、又、プロセッサ304により実行されるべき命令及び情報を格納するためにバス302に結合されている例えばランダムアクセスメモリ(RAM)又はその他のダイナミック格納装置等のメインメモリ306を包含している。メインメモリ306は、又、プロセッサ304による命令の実行期間中に一次的な変数又はその他の中間情報を格納するために使用することが可能である。コンピュータシステム300は、更に、プロセッサ304に対する静的情報及び命令を格納するためにバス302に結合されているリードオンリメモリ(ROM)308又はその他の静的格納装置を包含することが可能である。磁気ディスク又は光学ディスク等の格納装置310が設けられており且つ情報及び命令を格納するためにバス302へ結合されている。
図3は本発明の1実施例を実現することが可能なコンピュータシステム300を例示したブロック図である。コンピュータシステム300は、情報交換を簡単化させるためのバス302、及び情報を処理するためにバス302と結合されている1個又はそれ以上のプロセッサ304を包含している。コンピュータシステム300は、又、プロセッサ304により実行されるべき命令及び情報を格納するためにバス302に結合されている例えばランダムアクセスメモリ(RAM)又はその他のダイナミック格納装置等のメインメモリ306を包含している。メインメモリ306は、又、プロセッサ304による命令の実行期間中に一次的な変数又はその他の中間情報を格納するために使用することが可能である。コンピュータシステム300は、更に、プロセッサ304に対する静的情報及び命令を格納するためにバス302に結合されているリードオンリメモリ(ROM)308又はその他の静的格納装置を包含することが可能である。磁気ディスク又は光学ディスク等の格納装置310が設けられており且つ情報及び命令を格納するためにバス302へ結合されている。
コンピュータシステム300は、バス302を介して、コンピュータユーザに対し情報を表示するための陰極線管(CRT)等のディスプレイ312へ結合させることが可能である。英文字又はその他のキーを包含する入力装置314がプロセッサ304に対し情報及びコマンド選択を通信するためにバス302へ結合されている。別のタイプのユーザ入力装置はマウス、トラックボール、又はカーソル方向キー、等の指示情報及びコマンド選択をプロセッサ304へ通信し且つディスプレイ312上のカーソルの動きを制御するためのカーソル制御器316である。この入力装置は、典型的に、2つの軸において2つの自由度を有しており、即ち第一軸(例えばx)及び第二軸(例えばy)であり、それは該装置が面内における位置を特定することを可能とさせる。
コンピュータシステム300において、バス302は種々のコンポーネントの間で情報、信号、データ等を交換させることを可能とする任意のメカニズム及び/又は媒体とすることが可能である。例えば、バス302は電気信号を担持する1組の導体とすることが可能である。バス302は、又、コンポーネントの1つ又はそれ以上の間でワイヤレス信号を担持するワイヤレス媒体(例えば、空気)とすることが可能である。バス302は、又、コンポーネントのうちの1つ又はそれ以上の間で信号を容量的に交換することを可能とする媒体(例えば、空気)とすることが可能である。バス302は、更に、コンポーネントのうちの1つ又はそれ以上を接続するネットワーク接続とすることが可能である。相対的に、情報、信号、データ等を種々のコンポーネントの間で交換させることを可能とする任意のメカニズム及び/又は媒体はバス302として使用することが可能である。
バス302は、又、これらのメカニズム/媒体の結合とすることが可能である。例えば、プロセッサ304はワイヤレス的に格納装置310と通信する場合がある。このような場合には、バス302は、プロセッサ304と格納装置310の観点からは、ワイヤレス媒体、例えば空気である。更に、プロセッサ304は容量的にROM308と通信する場合がある。この場合には、バス302は、この容量的通信が行われることを可能とする媒体(例えば、空気)である。更に、プロセッサ304はネットワーク接続を介してメインメモリ306と通信する場合がある。この場合には、バス302はネットワーク接続である。更に、プロセッサ304は1組の導体を介してディスプレイ312と通信する場合がある。この場合には、バス302は1組の導体である。従って、どのようにして種々のコンポーネントが互いに通信するかに依存して、バス302は異なる形態をとる場合がある。バス302は、図3に示したように、種々のコンポーネントの間で情報、信号、データ等を交換することを可能とさせるメカニズム及び/又は媒体の全てを機能的に表わしている。
本発明は、本明細書に記載した技術を実現するためのコンピュータシステム300の使用に関連している。本発明の1実施例によれば、これらの技術はメインメモリ306内に包含される1つ又はそれ以上の命令の1つ又はそれ以上のシーケンスを実行するプロセッサ304に応答してコンピュータシステム300により実行される。このような命令は、格納装置310等の別の機械読取可能な媒体からメインメモリ306内に読込むことが可能である。メインメモリ306内に包含される命令のシーケンスの実行は、プロセッサ304をして、本明細書に記載した処理ステップを実施させる。別の実施例においては、本発明を実現するために、ハードワイヤード回路がソフトウエア命令の代わりに又はそれと結合して使用することが可能である。従って、本発明の実施例はハードウエア回路とソフトウエアの何等かの特定の結合に制限されるものではない。
本明細書に使用されている「機械読取可能な媒体」という用語は、マシンをして特定の態様で動作させるデータを供給することに参加する任意の媒体のことを意味している。コンピュータシステム300を使用して実現される実施例においては、種々の機械読取可能な媒体が、例えば、実行のためにプロセッサ304に対し命令を供給することに関与する。このような媒体は任意の形態をとることが可能であり、これらに制限されるものではないが、非揮発性媒体、揮発性媒体、伝送媒体を包含している。非揮発性媒体は、例えば、格納装置310等の光学的又は磁気的ディスクを包含している。揮発性媒体は、例えばメインメモリ306等のダイナミックメモリを包含している。伝送媒体は、バス302を構成するワイヤを包含して、同軸ケーブル、銅ワイヤ及びオプティカルファイバーを包含している。伝送媒体は、又、無線及び赤外線データ通信期間中に発生されるもののような音響又は光波の形態をとることも可能である。
機械読取可能な媒体の一般的な形態は、例えば、フロッピィディスク、フレキシブルディスク、ハードディスク、磁気テープ、又は任意のその他の磁気媒体、CD−ROM、任意のその他の光学的媒体、パンチカード、紙テープ、孔のパターンを具備する任意のその他の物理的媒体、RAM、PROM、EPROM、フラッシュEPROM、任意のその他のメモリチップ又はカートリッジ、後に説明するような搬送波、又はコンピュータがそれから読取ることが可能な任意のその他の媒体を包含している。
種々の形態の機械読取可能な媒体は、実行のためにプロセッサ304へ1つ又はそれ以上の命令の1つ又はそれ以上のシーケンスを担持する場合に関与する場合がある。例えば、その命令は、初期的には、遠隔コンピュータの磁気ディスク上に担持されている場合がある。その遠隔コンピュータはそのダイナミックメモリ内に命令をロードし且つその命令をモデムを使用して電話線を介して送信することが可能である。コンピュータシステム300に対してローカルなモデムが電話線を介してそのデータを受信し且つそのデータを赤外線信号へ変換するために赤外線送信器を使用することが可能である。赤外線検知器はその赤外線信号内に担持されるデータを受信することが可能であり且つ適宜の回路がそのデータをバス302上に配置させることが可能である。バス302はそのデータをメインメモリ306へ担持し、そこからプロセッサ304が命令を検索し且つ実行する。メインメモリ306により受取られる命令は、オプションとして、プロセッサ304による実行の前又は後のいずれかにおいて格納装置310上に格納させることが可能である。
コンピュータシステム300は、又バス302に結合されている通信インターフェース318を包含している。通信インターフェース318はローカルネットワーク322へ接続されているネットワークリンク320に対し二方向データ通信結合を提供する。例えば、通信インターフェース318は対応するタイプの電話線に対するデータ通信接続を与える統合サービスデジタルネットワーク(ISDN)カード又はモデムとすることが可能である。別の例として、通信インターフェース318は互換性のあるLANに対しデータ通信接続を与えるためのローカルエリアネットワーク(LAN)カードとすることが可能である。ワイヤレスリンクを実現することも可能である。いずれかのこのような実現において、通信インターフェース318は種々のタイプの情報を表わすデジタルデータストリームを担持する電気的、電磁的又は光学的信号を送信し且つ受信する。
ネットワークリンク320は、典型的に、他のデータ装置に対し1つ又はそれ以上のネットワークを介してデータ通信を提供する。例えば、ネットワークリンク320はローカルネットワーク322を介してホストコンピュータ324に対する、又はインターネットサービスプロバイダー(ISP)326により操作されるデータ装置に対しての接続を与えることが可能である。ISP326は今日「インターネット」328と一般的に呼称されるワールドワイドパケットデータ通信ネットワークを介してデータ通信サービスを提供する。ローカルネットワーク322及びインターネット328の両方はデジタルデータストリームを担持する電気的、電磁的又は光学的信号を使用する。種々のネットワークを介しての信号及びネットワークリンク320上及びコンピュータシステム300への及びそれからデジタルデータを担持する通信インターフェース318を介しての信号は、情報を輸送する搬送波の例示的な形態である。
コンピュータシステム300は、ネットワーク、ネットワークリンク320及び通信インターフェース318を介して、プログラムコードを包含するデータを受取り且つメッセージを送ることが可能である。インターネットの例においては、サーバー330はインターネット328、ISP326、ローカルネットワーク322、通信インターフェース318を介してアプリケーションプログラムに対して要求されたコードを送信する場合がある。
受信したコードは、それが受信された通りにプロセッサ304により実行される場合があり、及び/又は、後で実行するために、格納装置310、又はその他の非揮発性格納装置内に格納される場合がある。このように、コンピュータシステム300は搬送波の形態でアプリケーションコードを得る場合がある。
以上、本発明の具体的実施の態様について詳細に説明したが、本発明は、これら具体例にのみ制限されるべきものではなく、本発明の技術的範囲を逸脱することなしに種々の変形が可能であることは勿論である。
300 コンピュータシステム
302 バス
304 プロセッサ
306 メインメモリ
308 リードオンリメモリ(ROM)
310 格納装置
312 ディスプレイ
314 入力装置
316 カーソル制御器
318 通信インターフェース
320 ネットワークリンク
322 ローカルネットワーク
324 ホストコンピュータ
326 インターネットサービスプロバイダー(ISP)
328 インターネット
330 サーバー
302 バス
304 プロセッサ
306 メインメモリ
308 リードオンリメモリ(ROM)
310 格納装置
312 ディスプレイ
314 入力装置
316 カーソル制御器
318 通信インターフェース
320 ネットワークリンク
322 ローカルネットワーク
324 ホストコンピュータ
326 インターネットサービスプロバイダー(ISP)
328 インターネット
330 サーバー
Claims (15)
- 静的に型が付けられたプログラミング言語におけるより制限の少ないメソッドオーバーライド用の方法において、
第一クラスにおける第一メソッドが該第一クラスのサブクラスである第二クラスにおける第二メソッドと同一の名前を有しているか否かを決定し、
該第一メソッドが該第二メソッドと同一の名前を有しているという決定に応答して、1つ又はそれ以上の基準の各基準が満足されるか否かを決定し、その場合に該1つ又はそれ以上の基準は該第一クラスのシグネチャの消去が該第二クラスのシグネチャと同一であるという基準を包含しており、
該1つ又はそれ以上の基準が満足されるという決定に応答して、該第二メソッドが該第一メソッドをオーバーライドすることを許容し、1組のケースにおける少なくとも1つのケースが真であり、
該1組のケースが、
該第一メソッドの1つ又はそれ以上のパラメータの型が該第二メソッドの1つ又はそれ以上のパラメータの型と異なるというケース、
該第一メソッドの戻り型が該第二メソッドの戻り型と異なるというケース、
から構成されていることを特徴とする方法。 - 請求項1において、
該第一メソッドは、各々が別個の境界を有する1つ又はそれ以上の第一型パラメータを有しており、
該第二メソッドは、各々が別個の境界を有している1つ又はそれ以上の第二型パラメータを有しており、
該第一メソッドの該シグネチャは該1つ又はそれ以上の第一型パラメータの1つ又はそれ以上の境界を有しており、
該第二メソッドの該シグネチャは該1つ又はそれ以上の第二型パラメータの1つ又はそれ以上の境界を有している、
ことを特徴とする方法。 - 請求項1において、
該1つ又はそれ以上の基準は、該第一メソッドがプライベートであると宣言されていないという基準を包含している、
ことを特徴とする方法。 - 請求項1において、
該第一メソッドが第一戻り型を有しており、
該第二メソッドが第二戻り型を有しており、
該1つ又はそれ以上の基準が、該第二戻り型がプリミティブ型である場合にはいつでも該第一戻り型が該第二戻り型と同一であるという基準を包含している、
ことを特徴とする方法。 - 請求項1において、
該第一メソッドが第一戻り型を有しており、
該第二メソッドが第二戻り型を有しており、
該1つ又はそれ以上の基準が、該第二戻り型が基準型である場合にはいつでも1組の条件における各条件が満足されるという基準を包含しており、
該1組の条件が、
該第一メソッドのシグネチャが該第二メソッドのシグネチャと同一でない場合にはいつでも該第二戻り型が該第一戻り型の消去の下位型であるという条件、
該第一メソッドのシグネチャが該第二メソッドのシグネチャと同一である場合にはいつでも、該第二戻り型が該第一戻り型の下位型、及び無検査変換プロセスを介して該第一戻り型の下位型へ変換させることが可能な型のうちの1つであるという条件、
を有していることを特徴とする方法。 - 1つ又はそれ以上のシーケンスの命令を担持する機械読取可能な媒体において、該命令は、1つ又はそれ以上のプロセッサにより実行される場合に、該1つ又はそれ以上のプロセッサをして、
第一クラスにおける第一メソッドが該第一クラスのサブクラスである第二クラスにおける第二メソッドと同一の名前を有しているか否かを決定し、
該第一メソッドが該第二メソッドと同一の名前を有しているという決定に応答して、1つ又はそれ以上の基準の各基準が満足されているか否かを決定し、尚該1つ又はそれ以上の基準は該第一クラスのシグネチャの消去が該第二クラスのシグネチャと同一であるという基準を包含しており、
該1つ又はそれ以上の基準が満足されると言う決定に応答して、該第二メソッドが該第一メソッドをオーバーライドすることを許容する、
上記各ステップを実施させ、
1組のケースにおける少なくとも1つのケースが真であり、
該1組のケースが、
該第一メソッドの1つ又はそれ以上のパラメータの型が該第二メソッドの1つ又はそれ以上のパラメータの型と異なるというケース、
該第一メソッドの戻り型が該第二メソッドの戻り型と異なるというケース、
から構成されていることを特徴とする機械読取可能な媒体。 - 請求項6において、
該第一メソッドは、各々が別個の境界を有している1つ又はそれ以上の第一型パラメータを有しており、
該第二メソッドは、各々が別個の境界を有している1つ又はそれ以上の第二型パラメータを有しており、
該第一メソッドのシグネチャが該1つ又はそれ以上の第一型パラメータの1つ又はそれ以上の境界を有しており、
該第二メソッドのシグネチャが該1つ又はそれ以上の第二型パラメータの1つ又はそれ以上の境界を有している、
ことを特徴とする機械読取可能な媒体。 - 請求項6において、
該1つ又はそれ以上の基準は、該第一メソッドがプライベートであると宣言されていないという基準を包含している、
ことを特徴とする機械読取可能な媒体。 - 請求項6において、
該第一メソッドが第一戻り型を有しており、
該第二メソッドが第二戻り型を有しており、
該1つ又はそれ以上の基準は、該第二戻り型がプリミティブ型である場合にはいつでも該第一戻り型が該第二戻り型とは同一ではないという基準を包含している、
ことを特徴とする機械読取可能な媒体。 - 請求項6において、
該第一メソッドが第一戻り型を有しており、
該第二メソッドが第二戻り型を有しており、
該1つ又はそれ以上の基準は、該第二戻り型が基準型である場合にはいつでも1組の条件における各条件が満足されるという基準を包含しており、
該1組の条件は、
該第一メソッドのシグネチャが該第二メソッドのシグネチャと同一でない場合にはいつでも該第二戻り型が該第一戻り型の消去の下位型であるという条件、
該第一メソッドのシグネチャが該第二メソッドのシグネチャと同一である場合にはいつでも、該第二戻り型が該第一戻り型の下位型、及び無検査変換プロセスを介して該第一戻り型の下位型へ変換させることが可能な型のうちの1つであるという条件、
を有している、
ことを特徴とする機械読取可能な媒体。 - 第一クラスにおける第一メソッドが該第一クラスの下位型である第二クラスにおける第二メソッドと同一の名前を有しているか否かを決定するメカニズム、
該第一メソッドが該第二メソッドと同一の名前を有しているという決定に応答して、1つ又はそれ以上の基準であって、該第一クラスのシグネチャの消去が該第二クラスのシグネチャと同一であるという基準を包含している1つ又はそれ以上の基準の各基準が満足されるか否かを決定するメカニズム、
該1つ又はそれ以上の基準が満足されるという決定に応答して、該第二メソッドが該第一メソッドをオーバーライドすることを許容するメカニズム、
を有しており、1組のケースにおける少なくとも1つのケースが真であり、且つ該1組のケースが、
該第一メソッドの1つ又はそれ以上のパラメータの型が該第二メソッドの1つ又はそれ以上のパラメータの型と異なるというケース、
該第一メソッドの戻り型が該第二メソッドの戻り型と異なるというケース、
から構成されていることを特徴とする装置。 - 請求項11において、
該第一メソッドは、各々が別個の境界を有している1つ又はそれ以上の第一型パラメータを有しており、
該第二メソッドは、各々が別個の境界を有している1つ又はそれ以上の第二型パラメータを有しており、
該第一メソッドのシグネチャは該1つ又はそれ以上の第一型パラメータの1つ又はそれ以上の境界を有しており、
該第二メソッドのシグネチャは該1つ又はそれ以上の第二型パラメータの1つ又はそれ以上の境界を有している、
ことを特徴とする装置。 - 請求項11において、
該1つ又はそれ以上の基準は、該第一メソッドがプライベートであると宣言されていないという基準を包含している、
ことを特徴とする装置。 - 請求項11において、
該第一メソッドが第一戻り型を有しており、
該第二メソッドが第二戻り型を有しており、
該1つ又はそれ以上の基準は、該第二戻り型がプリミティブ型でない場合にはいつでも該第一戻り型が該第二戻り型と同一であるという基準を包含している、
ことを特徴とする装置。 - 請求項11において、
該第一メソッドが第一戻り型を有しており、
該第二メソッドが第二戻り型を有しており、
該1つ又はそれ以上の基準は、該第二戻り型が基準型である場合にはいつでも1組の条件における各条件が満足されるという基準を包含しており、
該1組の条件は、
該第一メソッドのシグネチャが該第二メソッドのシグネチャと同一でない場合にはいつでも該第二戻り型が該第一戻り型の消去の下位型であるという条件、
該第一メソッドのシグネチャが該第二メソッドのシグネチャと同一である場合にはいつでも、該第二戻り型が、該第一戻り型の下位型、及び無検査変換プロセスを介して該第一戻り型の下位型へ変換させることが可能な型のうちの1つであるという条件、
を有していることを特徴とする装置。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US11/174,073 US7735070B2 (en) | 2005-06-30 | 2005-06-30 | Allowing non-generified methods to override generified methods |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2007012064A true JP2007012064A (ja) | 2007-01-18 |
Family
ID=36754196
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2006178136A Pending JP2007012064A (ja) | 2005-06-30 | 2006-06-28 | 非ジェネリック化方法がジェネリック化方法をオーバーライドすることの許可 |
Country Status (3)
Country | Link |
---|---|
US (1) | US7735070B2 (ja) |
EP (1) | EP1739550A3 (ja) |
JP (1) | JP2007012064A (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2008269274A (ja) * | 2007-04-20 | 2008-11-06 | Meidensha Corp | ソフトウェア開発支援システム、開発支援方法およびプログラム |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8402431B2 (en) * | 2008-04-09 | 2013-03-19 | Renesas Electronics America Inc. | System and method for communicating with a microcontroller |
US8533671B2 (en) * | 2010-06-07 | 2013-09-10 | Microsoft Corporation | Assigning type parameters |
US8813049B2 (en) * | 2010-06-30 | 2014-08-19 | Oracle International Corporation | Type inference of partially-specified parameterized types |
US9424010B2 (en) * | 2010-08-30 | 2016-08-23 | International Business Machines Corporation | Extraction of functional semantics and isolated dataflow from imperative object oriented languages |
US8893098B2 (en) * | 2012-12-14 | 2014-11-18 | Oracle International Corporation | Deferred type inference of generic type parameters in function calls to overloaded functions |
US9104432B2 (en) | 2013-06-24 | 2015-08-11 | International Business Machines Corporation | Extracting stream graph structure in a computer language by pre-executing a deterministic subset |
US10275226B2 (en) * | 2015-10-23 | 2019-04-30 | Oracle International Corporation | Structural representation of generic type variable in a nominally typed virtual machine |
US10908886B2 (en) | 2016-07-12 | 2021-02-02 | Oracle International Corporation | Accessing a migrated member in an updated type |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5737607A (en) * | 1995-09-28 | 1998-04-07 | Sun Microsystems, Inc. | Method and apparatus for allowing generic stubs to marshal and unmarshal data in object reference specific data formats |
US6018628A (en) * | 1998-06-16 | 2000-01-25 | Sun Microsystems, Inc. | Method of implementing parameterized types to be compatible with existing unparameterized libraries |
US6725280B1 (en) * | 1999-08-13 | 2004-04-20 | Sun Microsystems, Inc. | Method and apparatus for constructing dispatch tables which enable transitive method override |
JP4662657B2 (ja) * | 2000-07-10 | 2011-03-30 | マイクロソフト コーポレーション | 統一データ型システムおよび方法 |
US7152223B1 (en) * | 2001-06-04 | 2006-12-19 | Microsoft Corporation | Methods and systems for compiling and interpreting one or more associations between declarations and implementations in a language neutral fashion |
US7644402B1 (en) * | 2004-03-17 | 2010-01-05 | Sun Microsystems, Inc. | Method for sharing runtime representation of software components across component loaders |
US7810077B2 (en) * | 2005-04-18 | 2010-10-05 | Oracle America Inc. | Reifying generic types while maintaining migration compatibility |
-
2005
- 2005-06-30 US US11/174,073 patent/US7735070B2/en active Active
-
2006
- 2006-06-21 EP EP06253209A patent/EP1739550A3/en not_active Ceased
- 2006-06-28 JP JP2006178136A patent/JP2007012064A/ja active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2008269274A (ja) * | 2007-04-20 | 2008-11-06 | Meidensha Corp | ソフトウェア開発支援システム、開発支援方法およびプログラム |
Also Published As
Publication number | Publication date |
---|---|
EP1739550A3 (en) | 2008-01-23 |
US20070006138A1 (en) | 2007-01-04 |
EP1739550A2 (en) | 2007-01-03 |
US7735070B2 (en) | 2010-06-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5044139B2 (ja) | 移行互換性を維持したままのジェネリック型の具体化 | |
US8448132B2 (en) | Systems and methods for modifying code generation templates | |
KR101795844B1 (ko) | 런타임 시스템 | |
US6018628A (en) | Method of implementing parameterized types to be compatible with existing unparameterized libraries | |
JP2007012064A (ja) | 非ジェネリック化方法がジェネリック化方法をオーバーライドすることの許可 | |
JP5021805B2 (ja) | データ型を処理するシステムおよび方法 | |
JP4668971B2 (ja) | データ型を処理するためのシステムおよびメソッドのコールを実行する方法 | |
US5872977A (en) | Object-oriented method and apparatus for creating a makefile | |
US9395963B1 (en) | System and method for accessing meta-data in a dynamically typed array-based language | |
JP2007012066A (ja) | ローカル及び匿名クラスに対するイントロスペクションサポート | |
JP6602283B2 (ja) | オブジェクト指向スクリプトツールをサポートするシステムおよび方法 | |
US20090319554A1 (en) | Unified metadata for external components | |
US7219340B2 (en) | Changeable class and pattern to provide selective mutability in computer programming environments | |
US20090320007A1 (en) | Local metadata for external components | |
US6951022B1 (en) | Delegate-based event handling | |
EP2181387A1 (en) | A programming environment with support for handle and non-handle user-created classes | |
US20060080644A1 (en) | Parameterization of programming structures | |
CN117519848A (zh) | 一种函数调用方法、装置、设备及存储介质 | |
JP5165234B2 (ja) | ジャバ言語におけるメソッド参照のサポート | |
EP1157330A1 (en) | Method and system for implementing virtual functions of an interface | |
US7526752B1 (en) | Introspection support for generic types | |
US20110321009A1 (en) | Implementing encryption via aspect oriented programming | |
JP2005267644A (ja) | 共通言語ランタイム言語におけるリソースのアドレスサポート | |
US9058339B2 (en) | Source control inheritance locking | |
Vernon | D3. 2 Software Engineering Standards Manual |