JP2006302285A - 移行互換性を維持したままのジェネリック型の具体化 - Google Patents

移行互換性を維持したままのジェネリック型の具体化 Download PDF

Info

Publication number
JP2006302285A
JP2006302285A JP2006114767A JP2006114767A JP2006302285A JP 2006302285 A JP2006302285 A JP 2006302285A JP 2006114767 A JP2006114767 A JP 2006114767A JP 2006114767 A JP2006114767 A JP 2006114767A JP 2006302285 A JP2006302285 A JP 2006302285A
Authority
JP
Japan
Prior art keywords
type
argument
actual
determining
actual type
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.)
Granted
Application number
JP2006114767A
Other languages
English (en)
Other versions
JP5044139B2 (ja
Inventor
Gilad Bracha
ブラチャ ギルダ
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sun Microsystems Inc
Original Assignee
Sun Microsystems Inc
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Sun Microsystems Inc filed Critical Sun Microsystems Inc
Publication of JP2006302285A publication Critical patent/JP2006302285A/ja
Application granted granted Critical
Publication of JP5044139B2 publication Critical patent/JP5044139B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking
    • G06F8/437Type checking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Computational Linguistics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

【課題】 移行互換性を維持しながらジェネリック型を具体化する技術を提供する。
【解決手段】 本発明によれば、移行互換性を維持しながらジェネリック型を具体化する技術が提供される。この技術によれば、生の型と関連するがバイナリーファイルにおいて表現されることのない実型パラメータがランタイムにおいて動的に推測される。生のタイプのインスタンスであるオブジェクトの使用に基づいてランタイムで実型パラメータが推測される。
【選択図】 図1

Description

本発明はジェネリック型の具体化に関するものであって、更に詳細には、移行互換性を維持しながらジェネリック型を具体化する技術に関するものである。
Java開発キット(JDK)は、Javaプログラムを発生させるためのソフトウエア開発キットである。JDKバージョン1.5は、Javaプログラミング言語に対して幾つかの拡張を導入させている。これらの拡張のうちの1つは「ジェネリック型」の導入である。
Javaにおけるジェネリック型は、全く同じというわけではないが、C++プログラミング言語におけるテンプレートに類似している。ジェネリック型は、ジェネリック型の使用を有益的なものとさせる事例の説明を介して最も容易に理解することが可能である。
Javaのような強く型付けされた言語の構文規則に従って、変数のデータ型はその変数の宣言において表現されることとなっている。以下の宣言が例示的なものである。
Figure 2006302285
上の宣言において、変数「x」は「整数」型であることが宣言されている。従って、「x」に対して「整数」クラス又はその下位型のインスタンスではないオブジェクトを割当てようとする試みは禁止されるべきであって、且つコンパイラーをして割当てにおいて何かが間違っていることをプログラマーに対して警告すべきである。
以下の宣言は幾分より洗練されており且つ知識を与えるものである。
Figure 2006302285
上の宣言において、変数「myIntList」は型「List」のものであることが宣言されている。上の表現が評価されると、「LinkedList()」コンストラクターメソッドの呼出しを介して「LinkedList」クラスの新たなインスタンス(即ち、「Linkedlist」オブジェクト)が形成され(インスタンス化され)且つ「myIntList」へ割当てられる。「List」及び「LinkedList」クラスは以下の説明において例として使用するが、以下に説明するクラスの挙動はこれらのクラスにのみ制限されるものでないことを理解すべきである。
型「List」のその他の変数のように、変数「myIntList」は「LinkedList」オブジェクトを割当てることが可能である。「LinkedList」オブジェクトは他のオブジェクトのリンクされたリストである。Javaにおけるジェネリック型の導入前においては、コンパイラーはこれらの他のオブジェクトの特定の型が何であるかを決定することは不可能であった。型システムはランタイム挙動の保守的な近似であった。例えば、ジェネリック型がない場合には、「Foo」型オブジェクトがLinkedList内へ「挿入」だけでは、LinkedListからこれらのオブジェクトを「抽出」した場合に、コンパイラーはそのオブジェクトが型「Foo」であることを決定することは不可能である。ジェネリック型がない場合には、コンパイラーは、これらのオブジェクトが「Object」クラスの何等かの不確定な下位型のインスタンスであることを決定することが可能であるに過ぎない。Javaにおいては、全てのクラスが「Object」クラスのサブタイプ即ち下位型である。これはコンパイラーが得ることが可能な特定の限界であるので、「抽出」されたオブジェクトは、それらに関して喚起された「Object」クラス(「Foo」クラスに対して)のメソッドを有することが可能であるに過ぎない。
この欠点のために、特定のデータ型であると宣言された変数に対してそのオブジェクトを割当てる前に、このように戻されたオブジェクトを特定のデータ型へ「キャスト」することがプログラマーにとってしばしば必要となっていた。以下のコードはこのことを示している。
Figure 2006302285
上のコードにおいて、メソッドにより戻された「Object」型オブジェクトは型「Integer」の変数へ明示的にキャストされている。このキャストが実施されなかった場合には、非「Integer」型オブジェクトが型「Integer」の変数へ割当てられることをコンパイラーが注意する場合がある。全くこのような注意は有益的なものである。何故ならば、コンパイラーがこのような割当てについて注意を促さない場合には、コンパイルされたプログラムは、メソッドが実際に整数でないオブジェクトを戻した場合に、異外で且つ不所望の挙動を示す場合があるからである。
このようにオブジェクトをキャストせねばならないことは、通常、プログラマーを苛立たせ且つソースコードを不所望にくどいものであり且つ読みにくいものとさせる。キャストするということは「ダーティ」なプログラミング作業であると考えるような人がいるかもしれない。幸運なことに、Javaにおけるジェネリック型の出現はキャストすることを不必要なものとさせ、少なくとも、上述した目的のためには不必要なものとさせている。ジェネリック型を組込んだサンプルの宣言は以下の如くである。
Figure 2006302285
これは、「myIntList」へ割当てられたリンクされたリスト内のオブジェクトがクラス「Integer」のインスタンスであることをこの宣言が明示的に示していることを除いて、上の非ジェネリック型宣言に類似している。この宣言に鑑み、「myIntList.iterator().next()」メソッドにより戻される全てのオブジェクトが「Integer」オブジェクトであることをコンパイラーが知得する。コンパイラーは次の表現、
Figure 2006302285
について不平を言うものではない。何故ならば、メソッドにより戻されるオブジェクトは「Integer」オブジェクトでなければならず且つ変数「x」は型「Integer」のオブジェクトを参照することが可能であることをコンパイラーが決定することが可能だからである。単一の宣言が潜在的に多数のキャストを不必要なものとさせる。
更に注意すべきことであるが、そのクラスの多数の別々のインプリメンテーションを必要とすることなしに、ジェネリック型はこのような態様における特定性を可能とする。「myIntList」は「Integer」オブジェクトを参照する「List」オブジェクトであるが、「Integer」オブジェクトのみを参照するためにプログラマーが「List」クラスのインプリメンテーションを特定的にコード化することは必要ではない。ジェネリック型はクラスを一般的な態様で定義し、次いで異なる特定の宣言において複数回喚起させることを可能とする。
ジェネリック型が提供するランタイム挙動のより精密な近似のために、ジェネリック型は、又、ランタイム障害を回避することを助ける。ジェネリック型宣言の実際の例を以下に示してある。
Figure 2006302285
上のジェネリック型宣言において、不等号で囲まれたパラメータ(例えば、「<E>」)はジェネリック型の「仮型パラメータ」と呼ばれる。このようなジェネリック型の特定の呼出しは「パラメータ化された型」と呼ばれる。例えば、以下の型表現はパラメータ化された型である。
Figure 2006302285
前のパラメータ化された型において、「<Integer>」は「実型引数」の例である。パラメータ化された型は、ジェネリック型宣言が喚起される場合に、仮型パラメータの代わりに入れられるべき実型引数を特定する。
Javaジェネリック型及びC++テンプレートは構文的及び機能的に幾分類似しているが、これら2つの間には幾つかの顕著な差異が存在している。Javaジェネリック型の宣言は、ソースコード内又はバイナリーコード内において、異なる実型引数に対する複数の異なる特定の宣言へ拡張されることはない。その代わりに、Javaにおける非ジェネリック型宣言の場合のように、Javaジェネリック型宣言は単一のクラスファイルへコンパイルされる。
ジェネリック型は非常に有用なものであるので、Javaライブラリ内に従来から存在していた非ジェネリック型宣言の多くはジェネリック型宣言と置換されている。非ジェネリックメソッド宣言も、これらのライブラリにおいて、ジェネリックメソッド宣言と置換されている。換言すると、以前の非ジェネリック型及びメソッド宣言は「ジェネリック化」されている。新たなJavaプログラムを書いているプログラマーは、そのプログラム内にパラメータ化した型を入れることによりジェネリック型及びメソッドを利用することが可能である。
然しながら、Java言語は、既に、かなりの期間にわたって存在していたものであるから、多くのJavaプログラムが既に書かれている。想像することが可能であるように、これらのプログラムの多くはパラメータ化された型を包含するものではない。その代わりに、これらのプログラムの多くは、実型引数を特定することのない呼出しを包含している。コンパイラーがジェネリック型宣言の全ての呼出しをパラメータ化された型であることを必要とする場合には(実型引数を特定することのない呼出しに対して)、既存のJavaプログラムの多くは新たなJavaライブラリと互換性のないものとなる。
上の問題を解消する1つの試みは、ジェネリック型宣言の全ての呼出しがジェネリック型宣言における各下位型パラメータに対し実型引数を特定するように既存のJavaプログラムを修正することを必要とすることである。このような態様で非常に大きなプログラムを修正することは厄介な作業であり、実際に、プログラマーは、その代わりに、新たなJavaライブラリ及びジェネリック型メカニズムを使用することを完全に諦めることを好む場合がある程厄介なものである。
上の問題を解決する別のアプローチは、その呼出しがジェネリック型宣言における仮型パラメータに対する実型引数を特定するものでないものであってもジェネリック型宣言の呼出しをプログラムが包含することをコンパイラーが許容するような態様でコンパイラーをインプリメント即ち実現することが関与する。ジェネリック型宣言における仮型パラメータに対する実型引数を特定することのないジェネリック型呼出しは「生の型」(このような実型引数を特定する「パラメータ化された型」と対比して)と呼ばれる。コンパイラーが生の型を参照する表現に遭遇すると、その表現の正しいことを保証することが不可能であることをコンパイラーが警告し、コンパイラーは生の型に関して型のチェックを実施することは不可能である。それにも拘わらず、コンパイラーはコンパイル作業が進行することを許容する。ランタイムにおいてその表現が不所望な効果を発生することがないことを確保することの責任はプログラマーに課されている。
Javaランタイム環境は、伝統的に、インスタンス化されたオブジェクトに関するクラス情報をランタイムにおいて決定するためにプログラムが使用することが可能なランタイムデータ構造及びメカニズムを提供していた。例えば、「instanceof」演算子を使用して、Javaプログラムは、特定したオブジェクトが特定したクラスのインスタンスであるか否かを決定することが可能である。
然しながら、Javaプログラムがコンパイルされると、パラメータ化された型において特定されている実型引数は結果的に得られるバイナリーファイル内において保存されるものではなく、このような引数は「消去」と呼ばれる処理において失われる。必ずしもその唯一の目的というわけではないが、消去は、生の型を包含するプログラムが、上述した如く、ジェネリック型宣言を包含するライブラリと相互作用を行うことを可能とする。消去を介して、パラメータ化された型のインスタンスのバイナリー表示は、対応する生の型のインスタンスのバイナリー表示と同一となる。これらのバイナリー表示は同一であるので、生の型を包含しているプログラムからコンパイルした古いバイナリーファイルは、ジェネリック型宣言を包含しているライブラリーからコンパイルした新しいバイナリーファイルとリンクさせることが可能である。
然しながら、消去の結果として、Javaランタイム環境は、現在、パラメータ化された型のインスタンスであるオブジェクトに関しての何等かの特定の情報をプログラムが決定することを可能とする方法を有するものではない。
例えば、Javaランタイム環境は、現在のところ、特定したオブジェクトが特定した実型引数を有するパラメータ化された型のインスタンスであるか否かをプログラムが決定することを可能とするものではない。Javaランタイム環境は、その結果が、変数「x」が一般的に型「Collection」の変数であるか否かに依存するある表現を正確に評価することが可能なものであるが、例えば、Javaランタイム環境は、現在のところ、その結果が、変数「x」が特定的に型「Collection<String>」の変数であるか否かに依存するある表現を正確に評価することは不可能である。例えソースコードが実型引数「<String>」でパラメータ化された型を最初に表わすものであっても、実型引数「<String>」は、プログラムがバイナリーファイルへコンパイルされる場合に消去されてしまう。
それにも拘わらず、前者の種類の表現を正確に評価することが可能なJavaランタイム環境でもって長い間作業したプログラマーは、当然に、Javaランタイム環境が後者の種類の表現を正確に評価することが可能であるベきことを期待している。
本発明は、以上の点に鑑みなされたものであって、上述した如き従来技術の欠点を解消し、改良したジェネリック型の具体化技術を提供することを目的とする。本発明の別の目的とするところは、移行互換性を維持しながらジェネリック型を具体化する技術を提供することである。
本発明の1実施例によれば、移行互換性を維持しながらジェネリック型を具体化する技術が提供される。この技術によれば、生の型と関連すべきであるがバイナリーファイルにおいて表現されていない実型パラメータがランタイムにおいて動的に推測される。生の型のインスタンスであるオブジェクトのランタイム使用に基づいて実型パラメータが推測される。
1実施例においては、特定のオブジェクトがインスタンスであるジェネリック型の実型引数がランタイムにおいてのオブジェクトの使用に基づいて動的に決定される。このことは、オブジェクトの呼出しが何等の実型引数を特定するものではない環境の下で発生し、例えば、その呼出しは「List myIntList」である場合があり、それは「<Integer>」のような実型引数を欠如している。実型引数を表わすデータが発生される。特定のオブジェクトとそのデータとの間の関連が確立される。その結果、ランタイム環境は、特定のオブジェクトの型の実型引数がテストされるか又はその他の態様でプログラムにおいて必要とされる場合には、そのデータから特定のオブジェクトの型の実型引数を読取ることが可能である。
特定のオブジェクトの型の実型引数は種々の手段を使用して決定することが可能である。例えば、実型引数は、その特定のオブジェクト内に挿入された他のオブジェクトの型に基づいて決定することが可能である。別の例として、実型引数は、その特定のオブジェクトが入力としてパスされるメソッドのパラメータと関連している別の実型引数に基づいて決定することが可能である。別の例として、実型引数は、その特定のオブジェクトが割当てられた別のオブジェクトと関連している別の実型引数に基づいて決定することが可能である。
本明細書に記載する技術は、ジェネリック化したライブラリにおいて特定される全ての実型引数が、該ライブラリと生の型のみを包含するレガシーコード、即ちパラメータ化させた型を組込むために未だに「移行」されていないコードとの間の互換性を維持するためにコンパイル時において消去される環境下においても実型引数を動的に決定するために使用することが可能である。従って、本明細書に記載する技術は、移行互換性を維持しながらジェネリック型を具体化するために使用することが可能である。
概観
本発明の1実施例によれば、ジェネリック型を具体化する技術が提供される。本発明の1実施例の動作のハイレベルな概観を例示するフローチャートを図1に示してある。
図1を参照すると、ブロック102において、オブジェクトがインスタンスであるジェネリック型の実型引数を決定する。その実型引数はランタイムにおいてのそのオブジェクトの使用に基づいて決定される。
例えば、Java仮想マシン(JVM)が生の型を包含するJavaプログラムを稼動している場合がある。その生の型は何等実型引数(例えば、「List myIntList」)を特定するものではないジェネリック型のインボケーション(invocation)即ち呼出しである。生の型のインスタンスであるオブジェクトがどのようにパスされ、割当てられ、及び/又はそのメソッドを喚起させるかに基づいて、JVMは、少なくとも部分的に、そのオブジェクトの型の実型引数を決定することが可能である。
例えば、オブジェクト「myIntList」がメソッド「count(Collection<Number>c)」へのパラメータとしてパスされると、JVMは、このことから、そのオブジェクトの「List」型の実型パラメータが「Number」又はそのサブタイプ即ち下位型であることを決定することが可能であり、換言すると、JVMは、「myIntList」がジェネリック型「List<Number>」のインスタンスであることを決定することが可能である。
ブロック104において、実型引数を表わすデータが発生される。例えば、JVMは、「<Number>」の実型引数を表わすデータを発生することが可能である。
ブロック106において、そのオブジェクトとそのデータとの間の関連が確立される。例えば、JVMは、オブジェクト「myIntList」と実型パラメータ「<Number>」との間の関連をランタイムデータ構造内に格納することが可能である。その後、JVMは、例えば「instanceof」演算子又はキャストを包含する表現において、オブジェクト「myIntList」のジェネリック型がテストされる場合にその関連を参照することが可能である。JVMは、例えば割当て等のオブジェクトが関与するその他の表現が合法なものであるか否かを決定するためにその関連を参照することが可能である。
その他の側面において、本発明は、ある実施例においては、コンピュータ装置、コンピューティングシステム、及び前述した技術のうちの1つ又はそれ以上を実施すべく形態とされたコンピュータにより読取可能な媒体を包含している。
実型引数の動的推測
図2A及び2Bは、本発明の1実施例に基づいて、ランタイムにおいてジェネリック型に対する実型引数を決定するための技術を例示するフローチャートである。例えば、JVMはランタイムにおいてこのような技術を実施することが可能である。本技術のステップは説明の便宜上特定の順番にあるものとして示してあるが、本技術のステップはこの例に示した特定の順番以外の順番で実施することが可能である。
図2Aを参照すると、ブロック202において、「<[Tmax]?super[L]extends[U]>」の形態の実型引数が生の型のインスタンスであるオブジェクト「O」と関連している。実型引数において、値「Tmax」、「L」、「U」は実型引数の境界を拘束すべく機能し、その実型引数は、その実型引数における「ワイルドカード」パラメータ「?」により示されるように不確定な型のものである。
「L」はその実型引数の下界型を示しており、これはその不確定な型があり得るべき最も特定の型である。「U」はその実型引数の上界型を示しており、これはその不確定な型があり得るべき最も一般的な型である。「Tmax」はオブジェクト「O」内に挿入されているその他のオブジェクトの最も一般的な型を示している。以下に説明するように、拘束条件「Tmax」、「L」、「U」の全ては、該オブジェクトの使用に基づいてランタイムで洗練化させることが可能である。このランタイム洗練化処理を介して、オブジェクト「O」のジェネリック型の実型引数はより確かなものとされ、その実型引数の境界は「厳しくなる」場合がある。
通常、「L」の初期値は「Null」であり、且つ「U」の初期値は「Object」である。従って、通常、不確かな型「?」は、初期的に、非常に特定的な「Null」から非常に一般的な「Object」の範囲にわたる任意の型とすることが可能である。「Tmax」の初期値も「Null」であり、何故ならば、未だにオブジェクト「O」内にオブジェクトが挿入されていないからである。
ブロック204に対する各アクセスは、JVMがプログラムを実行する処理において別の命令を読取ることに対応している場合がある。
ブロック204において、別のオブジェクト「Q」がオブジェクト「O」内に挿入されたか否かが決定される。例えば、プログラムの稼動中において、JVMは、プログラムにおける現在の命令が1つのオブジェクトをオブジェクト「O」内に挿入させる命令であるか否かを決定する場合がある。通常、このような挿入はオブジェクト「O」の特定の挿入メソッドを介して達成される。例えば、その挿入命令は「O.add(Q)」の形態をとる場合があり、その場合に、「Q」は「add」メソッドが「O」内に挿入する別のオブジェクトである。別のオブジェクトがオブジェクト「O」内に挿入されると、制御はブロック206へパスする。そうでない場合には、制御はブロック212へパスする。
ブロック206において、オブジェクト「Q」のタイプが上界型「U」のスーパータイプ即ち上位型であるか否かが決定される。そうである場合には、制御がブロック208へパスする。そうでない場合には、制御はブロック210へパスする。
ブロック208において、ランタイムエラーが表示される。例えば、JVMがプログラムの実行を停止させ且つエラーが発生したことを表示する場合がある。「U」の上位型のインスタンスは上界として「U」を有する実型引数を有するジェネリック型のインスタンス内に挿入することは不可能である。例えば、「Q」が型「Object」のものであり、且つ「O」がその上界が「Number」であるジェネリック型のものである場合には、「Q」は「O」内に挿入することは不可能である。数のコレクション即ち集まりは、数ではないオブジェクトを包含することは不可能である。
一方、ブロック210において、「Tmax」は、オブジェクト「Q」の型及び「Tmax」の現在値の両方の最小上界であるようにアップデートされる。これら2つの型の最小上界は両方の型の最も特定的な上位型である。例えば、オブジェクト「Q」の型が「Float」であり且つ「Tmax」の現在値が「Double」である場合には、これら2つの最小上界は「Number」である。この場合には、「Tmax」の値は「Number」と等しいようにアップデートされる。「Object」も「Float」及び「Number」の両方の上位型であるが、「Object」は「Number」ほど特定的ではない。制御はブロック204へ戻る。
一方、ブロック212において「O」が、特定した実型引数を有するジェネリック型のものであるオブジェクトをパラメータとして受付けるメソッドへのパラメータとしてパスされたか否かが決定される。例えば、プログラムの稼動中に、JVMは、そのプログラムにおける現在の命令がオブジェクト「O」をして、そのパラメータが特定した実型引数を有するジェネリック型のものであるオブジェクトであることを予測するメソッドへのパラメータとしてパスさせる命令であるか否かを決定する場合がある。
例えば、その命令は「count(O)」の形態にある場合があり、その場合に、メソッド「count」の以前の宣言は「Integer count(Collection<Number>)」であった。この例において、メソッド(count)は、特定した実型引数「<Number>」を有するジェネリック型(特に、「Collection」又はその下位型)のものであるオブジェクトをパラメータとして受取ることを期待している。オブジェクト「O」がこのようなメソッドへパスされると、制御は図2Bにおけるブロック214へパスする。そうでない場合には、制御はブロック213へパスする。
ブロック213において、オブジェクト「O」が、特定した実型引数を有しているジェネリック型である別のオブジェクト「Q」へ割当てられているか否かが決定される。例えば、プログラムの稼動中に、JVMは、そのプログラムにおける現在の命令が、オブジェクト「O」をして、特定した実型引数を有するジェネリック型であるオブジェクトへ割当てさせる命令であるか否かを決定する場合がある。
例えば、その命令は「Q=O」の形態にある場合があり、その場合に、オブジェクト「Q」の以前の宣言は「Collection<Number>Q」であった。この例において、オブジェクト「Q」は特定した実型引数「<Number>」を有しているジェネリック型(特に、「Collection」)のものである。オブジェクト「O」がこのようなオブジェクトへ割当てられていると、制御は図2Bにおけるブロック214へパスする。そうでない場合には、制御はブロック204へ戻る。
1実施例において、ブロック212及び213に関連して説明した特定した実型引数が3つの形態のうちの1つをとる場合がある。図2Bを参照すると、ブロック214において、特定した実型引数が「<[T]>」、「<?extends[T]>」、又は「<?super[T]>」のいずれの形態にあるかが決定される。換言すると、特定した実型引数はある型、特定した上界を具備するある型、又は特定した下界を具備するある型であるか否かが決定される。その特定した実型引数が「<[T]>」の形態にある場合には、制御はブロック216へパスする。その特定した実型引数が「<?extends[T]>」の形態にある場合には、制御はブロック226へパスする。その特定した実型引数が「<?super[T]>」の形態にある場合には、制御はブロック232へパスする。
ブロック216において、拘束型「Tmax」が「T」の同一の型又は下位型のいずれであるかが決定される。「Tmax」が「T」の同一の型又は下位型のいずれかである場合には、制御はブロック220へパスする。そうでない場合には、制御はブロック218へパスする。
ブロック218において、ランタイムエラーが表示される。例えば、JVMはそのプログラムの実行を停止し且つエラーが発生したことを表示する場合がある。
一方、ブロック220において、「T」が下界型「L」の同一の型又は下位型のいずれかであるかが決定される。「T」が「L」の同一の型又は下位型のいずれかである場合には、制御はブロック222へパスする。そうでない場合には、制御はブロック218へ戻る。
ブロック222において、「T」が上界型「U」の同一の型又は下位型のいずれかであるかが決定される。「T」が「U」の同一の型又は下位型のいずれかである場合には、制御はブロック224へパスする。そうでない場合には、制御はブロック218へ戻る。
ブロック224において、オブジェクト「O」と関連している実型引数が「<[Tmax]?super[L]extends[U]>」から「<[T]>」へアップデートされる。この点において、オブジェクト「O」のジェネリック型の実型引数は確定している。例えば、「O」が生の型「Collection」のインスタンスであるとして宣言され、且つ「T」が「<Number>」であると、その実型引数を包含する「O」のパラメータ化された型は「Collection<Number>」となる。その実型引数を更に洗練化されるための試みは必要ではない。
一方、その特定した実型引数が「<?extends[T]>」の形態にある場合には、ブロック226において、拘束型「Tmax」が「T」の同一の型又は下位型のいずれかであるかが決定される。「Tmax」が「T」の同一の型又は下位型のいずれかである場合には、制御はブロック228へパスする。そうでない場合には、制御はブロック218へパスする。
ブロック228において、「T」が下界型「L」の同一の型又は下位型のいずれかであるかが決定される。「T」が「L」の同一の型又は下位型のいずれかである場合には、制御はブロック230へパスする。そうでない場合には、制御はブロック218へ戻る。
ブロック230において、「U」が「T」と「U」の現在値の両方の最大下界であるようにアップデートされる。換言すると、「U」は「T」及び「U」の両方の最も特定的でない下位型であるようにアップデートされる。制御は図2Aにおけるブロック204へ戻る。
一方、その特定した実型引数が「<?super[T]>」の形態にある場合には、ブロック232において、「T」が上界型「U」の同一の型又は下位型のいずれかであるかが決定される。「T」が「U」の同一の型又は下位型のいずれかである場合には、制御はブロック234へパスする。そうでない場合には、制御はブロック218へ戻る。
ブロック234において、「L」が「T」及び「L」の現在値の両方の最小上界であるようにアップデートされる。換言すると、「L」は「T」及び「L」の両方の最も特定的な上位型であるようにアップデートされる。制御は図2Aにおけるブロック204へ戻る。
従って、オブジェクト「O」がインスタンスであるジェネリック型の実型パラメータは、ランタイムにおいて、次第に且つ動的に推測され且つ洗練化される。
ジェネリックメソッド
クラスは、仮型パラメータと関連することが可能な唯一のプログラマチックエンティティではない。メソッドも仮型パラメータと関連することが可能である。以下のコードを例として考察する。
Figure 2006302285
上のコードは仮型パラメータ「E」を有するジェネリックメソッドを表わしている。レガシーコードは、例えば、
Figure 2006302285
のようなメソッドのジェネリックの前のバージョンの呼出しを包含している場合がある。
このような呼出しは「生の」呼出しと呼ばれる場合がある。何故ならば、その呼出しはジェネリックメソッド宣言における仮型パラメータにとって代わるべき実型パラメータを特定するものではないからである。本明細書に記載する技術を使用して、実型パラメータは使用に基づいてランタイムで推測することが可能である。
例えば、実型パラメータに関する何等かの情報はメソッドへパスされるオブジェクトの型から推測することが可能である。上の例において、オブジェクト「d」がメソッド「addall()」へのパラメータとしてパスされる。オブジェクト「d」のジェネリック型が「Collection<String>」(「Collection<String>d;」のような先の呼出しから決定することが可能であるように)である場合には、メソッド「addall()」の生の呼出しの実型パラメータは、少なくとも、「string」型を包含するのに充分に広いものであることを推測することが可能である。
1実施例においては、ジェネリックメソッドの各「生の」呼出しは別の実型パラメータと関連している。初期的には、「生の」呼出しと関連している実型パラメータは「<[X]super[L]extends[U]>」である。ジェネリック型に関して上述したのと同様の態様において、実型パラメータにおける拘束型「X」、「L」、「U」は使用に基づいてランタイムでアップデートし且つ洗練化させることが可能である。
ハードウエア概観
図3は本発明の1実施例を実現することが可能なコンピュータシステム300を例示したブロック図である。コンピュータシステム300は、情報交換を簡単化するためのバス302、及び情報を処理するためにバス302と結合されている1個又はそれ以上のプロセッサ304を包含している。コンピュータシステム300は、又、プロセッサ304に実行されるべき命令及び情報を格納するためにバス302と結合されている例えばランダムアクセスメモリ(RAM)又はその他のダイナミック記憶装置等のメインメモリ306を包含している。メインメモリ306は、又、プロセッサ304による命令の実行期間中に一次的な変数又はその他の中間情報を格納するために使用することが可能である。コンピュータシステム300は、更に、プロセッサ304に対する静的情報及び命令を格納するためにバス302へ結合されているリードオンリメモリ(ROM)308又はその他のスタチック記録装置を包含することが可能である。磁気ディスク又は光学ディスク等の格納装置310が設けられており且つ情報及び命令を格納するためにバス302へ結合されている。
コンピュータシステム300は、コンピュータユーザに対して情報を表示するために、陰極線管(CRT)等のディスプレイ312へバス302を介して結合させることが可能である。英文字又はその他のキーを包含する入力装置314が情報及びコマンド選択をプロセッサ304に対して通信するためにバス302へ結合されている。別のタイプのユーザ入力装置は、方向情報及びコマンド選択をプロセッサ304へ通信し且つディスプレイ312上のカーソルの運動を制御するためのマウス、トラックボール又はカーソル方向キー等のカーソル制御316である。この入力装置は、典型的に、第一軸(例えば、x)及び第二軸(例えば、y)の2つの軸における自由度2を有しており、それは該装置が面内における位置を特定することを可能とする。
コンピュータシステム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は異なる形態をとることが可能である。図3に示したように、バス302は、種々のコンポーネントの間で情報、信号、データ等を交換することを可能とするメカニズム及び/又は媒体の全てを機能的に表わしている。
本発明は、本明細書に記載した技術を実現するためのコンピュータシステム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は、ホストコンピュータ324に対して又はインターネットサービスプロバイダ(ISP)326により運営されているデータ装置に対しローカルネットワーク322を介しての接続を提供することが可能である。ISP326は、現在「インターネット」328として一般的に呼ばれているワールドワイドパケットデータ通信ネットワークを介してデータ通信サービスを提供する。ローカルネットワーク322及びインターネット328は、両方共、デジタルデータストリームを担持する電気的、電磁的又は光学的信号を使用する。ネットワークリンク320上の種々のネットワーク及び信号を介して及びコンピュータシステム300への及びそれからのデジタルデータを担持する通信インターフェース318を介しての信号は情報を移送する搬送波の例示的な形態である。
コンピュータシステム300はネットワーク、ネットワークリンク320及び通信インターフェース318を介してプログラムコードを包含するデータ及びメッセージを送り且つ受取ることが可能である。インターネットの例においては、サーバー330はインターネット328、ISP326、ローカルネットワーク322、通信インターフェース318を介して、アプリケーションプログラムに対して要求されたコードを送信する場合がある。
受取ったコードは、それが受取られるとプロセッサ304により実行され、及び/又は後に実行するために格納装置310、又はその他の非揮発性格納装置内に格納することが可能である。このように、コンピュータシステム300は搬送波の形態でアプリケーションコードを得ることが可能である。
前述した説明においては、本発明の実施例をインプリメンテーション毎に異なる場合のある多数の特定の詳細を参照して説明した。以上、本発明の具体的実施の態様について詳細に説明したが、本発明は、これら具体例にのみ制限されるべきものではなく、本発明の技術的範囲を逸脱することなしに種々の変形が可能であることは勿論である。
本発明の1実施例の動作の概観を例示したフローチャート。 本発明の1実施例に基づいてランタイムにおいてジェネリック型に対する実型引数を決定するためのプロセスの一部を示したフローチャート。 図2Aと結合されるべき同一のプロセスの残りの部分を示したフローチャート。 本発明の1実施例の1個又はそれ以上のコンポーネントを実現するために使用することが可能な例示的なコンピュータシステムを示したブロック図。
符号の説明
300 コンピュータシステム
302 バス
318 通信インターフェース
320 ネットワークリンク
322 ローカルネットワーク
324 ホストコンピュータ
326 インターネットサービスプロバイダ(ISP)
328 インターネット

Claims (26)

  1. ジェネリック型具体化方法において、
    ランタイムにおける第一オブジェクトの利用に基づいて、前記第一オブジェクトがインスタンスであるジェネリック型の第一実型引数を決定し、
    前記第一実型引数を表わすデータを発生し、
    前記第一オブジェクトと前記データとの間の関連を確立する、
    ことを包含していることを特徴とする方法。
  2. 請求項1において、前記第一実型引数を決定する場合に、更に、初期的に前記第一実型引数が拘束型により拘束される不確定な型であることを確立することを包含している方法。
  3. 請求項2において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて第二オブジェクトが前記第一オブジェクト内に挿入されたことを決定し、
    前記第二オブジェクトが前記第一オブジェクト内に挿入されたことの決定に応答して、
    前記第二オブジェクトがインスタンスである特定の型を決定し、
    前記特定の型及び前記拘束型の両方の最も特定的な上位型を決定し、
    前記拘束型を前記最も特定的な上位型へアップデートする、
    上記各ステップを実施する、
    ことを包含している方法。
  4. 請求項1において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが、入力パラメータとして第二実型引数と関連しているジェネリック型である第二オブジェクトを受付けるプログラマチックメソッドへパスされたことを決定し、
    前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第一実型引数を前記第二実型引数へアップデートする、
    ことを包含している方法。
  5. 請求項1において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリック型である第二オブジェクトへ割当てられたことを決定し、
    前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第一実型引数を前記第二実型引数へアップデートする、
    ことを包含している方法。
  6. 請求項1において、前記第一実型引数を決定する場合に、更に、初期的に、前記第一実型引数を第一上限型により拘束される不確定な型として確立することを包含している方法。
  7. 請求項6において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが、入力パラメータとして、第二実型引数と関連しているジェネリック型である第二オブジェクトを受付けるプログラマチックメソッドへパスされたことを決定し、
    前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第二実型引数が第二上限型により拘束される不確定な型を特定するか否かを決定し、
    前記第二実型引数が前記第二上限型により拘束される不確定な型を特定することを決定することに応答して、
    前記第一上限型及び前記第二上限型の両方の最も特定的でない下位型を決定し、
    前記第一上限型を前記最も特定的でない下位型へアップデートする、
    上記各ステップを実施する、
    ことを包含している方法。
  8. 請求項6において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが第二実型引数と関連しているジェネリック型である第二オブジェクトへ割当てられたことを決定し、
    前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第二実型引数が第二上限型により拘束される不確定な型を特定するか否かを決定し、
    前記第二実型引数が前記第二上限型により拘束される不確定な型を特定することを決定することに応答して、
    前記第一上限型及び前記第二上限型の両方の最も特定的でない下位型を決定し、
    前記第一上限型を前記最も特定的でない下位型へアップデートする、
    上記各ステップを実施する、
    ことを包含している方法。
  9. 請求項1において、前記第一実型引数を決定する場合に、更に、初期的に、前記第一実型引数を第一下限型により拘束される不確定な型として確立することを包含している方法。
  10. 請求項9において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが第二実型引数と関連しているジェネリック型である第二オブジェクトを入力パラメータとして受付けるプログラマチックメソッドへパスされたことを決定し、
    前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第二実型引数が第二下限型により拘束される不確定な型を特定するか否かを決定し、
    前記第二実型引数が前記第二下限型により拘束される不確定な型を特定することを決定することに応答して、
    前記第一下限型及び前記第二下限型の両方の最も特定的な上位型を決定し、
    前記第一下限型を前記最も特定的な上位型へアップデートする、
    上記各ステップを実施する、
    ことを包含している方法。
  11. 請求項9において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが第二実型引数と関連しているジェネリック型である第二オブジェクトへ割当てられたことを決定し、
    前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第二実型引数が第二下限型により拘束される不確定な型を特定するか否かを決定し、
    前記第二実型引数が前記第二下限型により拘束される不確定な型を特定することを決定することに応答して、
    前記第一下限型及び前記第二下限型の両方の最も特定的な上位型を決定し、
    前記第一下限型を前記最も特定的な上位型へアップデートする、
    上記各ステップを実施する、
    ことを包含している方法。
  12. ジェネリックメッソド具体化方法において、
    ランタイムにおいて、ジェネリックメソッドの呼出しにおいて表わされていない第一実型引数に基づいて、前記ジェネリックメソッドの呼出しの第二実型引数を決定し、尚前記呼出しは前記実型引数を特定するものではなく、
    前記第二実型引数を表わすデータを発生し、
    前記呼出しと前記データとの間の関連を確立する、
    ことを包含している方法。
  13. 命令の1つ又はそれ以上のシーケンスを担持するコンピュータにより読取可能な媒体であって、前記命令は、1個又はそれ以上のプロセッサにより実行される場合に、前記1個又はそれ以上のプロセッサをして、
    ランタイムにおける第一オブジェクトの利用に基づいて、前記第一オブジェクトがインスタンスであるジェネリック型の第一実型引数を決定し、
    前記第一実型引数を表わすデータを発生し、
    前記第一オブジェクトと前記データとの間の関連を確立する、
    上記各ステップを実施させることを特徴とするコンピュータにより読取可能な媒体。
  14. 請求項13において、前記第一実型引数を決定する場合に、更に、初期的に、前記第一実型引数が拘束型により拘束される不確定な型であることを確立することを包含しているコンピュータにより読取可能な媒体。
  15. 請求項14において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、第二オブジェクトが前記第一オブジェクト内に挿入されたことを決定し、
    前記第二オブジェクトが前記第一オブジェクト内に挿入されたことを決定することに応答して、
    前記第二オブジェクトがインスタンスである特定の型を決定し、
    前記特定の型及び前記拘束型の両方の最も特定的な上位型を決定し、
    前記拘束型を前記最も特定的な上位型へアップデートする、
    上記各ステップを実施する、
    ことを包含しているコンピュータにより読取可能な媒体。
  16. 請求項13において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリック型である第二オブジェクトを入力パラメータとして受付けるプログラマチックメソッドへパスされたことを決定し、
    前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第一実型引数を前記第二実型引数へアップデートする、
    ことを包含しているコンピュータにより読取可能な媒体。
  17. 請求項13において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリックタイプである第二オブジェクトへ割当てられたことを決定し、
    前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第一実型引数を前記第二実型引数へアップデートする、
    ことを包含しているコンピュータにより読取可能な媒体。
  18. 請求項13において、前記第一実型引数を決定する場合に、更に、初期的に、前記第一実型引数が第一上限型により拘束される不確定な型であることを確立することを包含しているコンピュータにより読取可能な媒体。
  19. 請求項18において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリック型である第二オブジェクトを入力パラメータとして受付けるプログラマチックメソッドへパスされたことを決定し、
    前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第二実型引数が第二上限型により拘束される不確定な型を特定するか否かを決定し、
    前記第二実型引数が前記第二上限型により拘束される不確定な型を特定することを決定することに応答して、
    前記第一上限型及び前記第二上限型の両方の最も特定的でない下位型を決定し、
    前記第一上限型を前記最も特定的でない下位型へアップデートする、
    上記各ステップを実施する、
    ことを包含しているコンピュータにより読取可能な媒体。
  20. 請求項18において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリックタイプである第二オブジェクトへ割当てられたことを決定し、
    前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第二実型引数が第二上限型により拘束される不確定な型を特定するか否かを決定し、
    前記第二実型引数が前記第二上限型により拘束される不確定な型を特定することを決定することに応答して、
    前記第一上限型及び前記第二上限型の両方の最も特定的でない下位型を決定し、
    前記第一上限型を前記最も特定的でない下位型へアップデートする、
    上記各ステップを実施する、
    ことを包含しているコンピュータにより読取可能な媒体。
  21. 請求項13において、前記第一実型引数を決定する場合に、更に、初期的に、前記第一実型引数を第一下限型により拘束される不確定な型であることを確立することを包含しているコンピュータにより読取可能な媒体。
  22. 請求項21において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが、第二実型引数と関連しているジェネリック型である第二オブジェクトを入力パラメータとして受付けるプログラマチックメソッドへパスされたことを決定し、
    前記第一オブジェクトが前記プログラマチックメソッドへパスされたことを決定することに応答して、前記第二実型引数が第二下限型により拘束される不確定な型を特定するか否かを決定し、
    前記第二実型引数が前記第二下限型により拘束される不確定な型を特定することを決定することに応答して、
    前記第一下限型及び前記第二下限型の両方の最も特定的な上位型を決定し、
    前記第一下限型を前記最も特定的な上位型であるようにアップデートする、
    上記各ステップを実施する、
    ことを包含しているコンピュータにより読取可能な媒体。
  23. 請求項21において、前記第一実型引数を決定する場合に、更に、
    ランタイムにおいて、前記第一オブジェクトが第二実型引数と関連しているジェネリックタイプのものである第二オブジェクトへ割当てられたことを決定し、
    前記第一オブジェクトが前記第二オブジェクトへ割当てられたことを決定することに応答して、前記第二実型引数が第二下限型により拘束される不確定な型を特定するか否かを決定し、
    前記第二実型引数が前記第二下限型により拘束される不確定な型を特定することを決定することに応答して、
    前記第一下限型及び前記第二下限型の両方の最も特定的な上位型を決定し、
    前記第一下限型を前記最も特定的な上位型であるようにアップデートする、
    上記各ステップを実施する、
    ことを包含しているコンピュータにより読取可能な媒体。
  24. 命令の1つ又はそれ以上のシーケンスを担持するコンピュータにより読取可能な媒体において、前記命令は、1つ又はそれ以上のプロセッサにより実行される場合に、前記1つ又はそれ以上のプロセッサをして、
    ランタイムにおいて、ジェネリックメソッドの呼出しにおいて表わされていない第一実型引数に基づいて、前記ジェネリックメソッドの呼出しの第二実型引数を決定し、尚前記呼出しは前記実型引数を特定するものではなく、
    前記第二実型引数を表わすデータを発生し、
    前記呼出しと前記データとの間の関連を確立する、
    上記各ステップを実施することを特徴とするコンピュータにより読取可能な媒体。
  25. ランタイムにおいて第一オブジェクトの利用に基づいて、前記第一オブジェクトがインスタンスであるジェネリック型の第一実型引数を決定するメカニズム、
    前記第一実型引数を表わすデータを発生するメカニズム、
    前記第一オブジェクトと前記データとの間の関連を確立するメカニズム、
    を有していることを特徴とする装置。
  26. ランタイムにおいて、ジェネリックメソッドの呼出しにおいて表わされていない第一実型引数に基づいて、前記ジェネリックメソッドの呼出しの第二実型引数を決定するメカニズム、尚前記呼出しは前記実型引数を特定するものではなく、
    前記第二実型引数を表わすデータを発生するメカニズム、
    前記呼出しと前記データとの間の関連を確立するメカニズム、
    を有していることを特徴とする装置。
JP2006114767A 2005-04-18 2006-04-18 移行互換性を維持したままのジェネリック型の具体化 Active JP5044139B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US11/109540 2005-04-18
US11/109,540 US7810077B2 (en) 2005-04-18 2005-04-18 Reifying generic types while maintaining migration compatibility

Publications (2)

Publication Number Publication Date
JP2006302285A true JP2006302285A (ja) 2006-11-02
JP5044139B2 JP5044139B2 (ja) 2012-10-10

Family

ID=36954610

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006114767A Active JP5044139B2 (ja) 2005-04-18 2006-04-18 移行互換性を維持したままのジェネリック型の具体化

Country Status (3)

Country Link
US (1) US7810077B2 (ja)
EP (1) EP1722300A1 (ja)
JP (1) JP5044139B2 (ja)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7735070B2 (en) * 2005-06-30 2010-06-08 Oracle America, Inc. Allowing non-generified methods to override generified methods
US8225294B2 (en) * 2006-04-27 2012-07-17 Oracle America, Inc. Method and apparatus for expressing and checking relationships between types
US7778983B2 (en) * 2007-03-06 2010-08-17 Microsoft Corporation Application migration file scanning and conversion
US8955043B2 (en) * 2010-01-27 2015-02-10 Microsoft Corporation Type-preserving compiler for security verification
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
US10705804B2 (en) * 2012-02-26 2020-07-07 Logistics Research Centre SIA Strongly typed metadata access in object oriented programming languages with reflection support
US8898632B2 (en) * 2012-08-31 2014-11-25 Oracle International Corporation Dispatch predicate for overloaded functions using type intervals
US8843887B2 (en) * 2012-08-31 2014-09-23 Oracle International Corporation Fast dispatch predicate for overloaded functions with generic type hierarchies that lack contravariance
US9411559B2 (en) * 2013-05-28 2016-08-09 The Mathworks, Inc. Resolution of textual code in a graphical hierarchical model of a technical computing environment
US9984175B2 (en) * 2015-09-30 2018-05-29 International Business Machines Corporation Mapping non-generic markup language elements to generic object-oriented programming language objects
US10466975B2 (en) * 2015-10-23 2019-11-05 Oracle International Corporation Execution of parameterized classes on legacy virtual machines to generate instantiation metadata
CN106886390B (zh) * 2015-12-15 2021-06-18 大唐软件技术股份有限公司 一种Java对象生成和转换方法和Java对象生成和转换装置
US20180074797A1 (en) * 2016-09-09 2018-03-15 Hewlett Packard Enterprise Development Lp Transform a data object in a meta model based on a generic type
US10572275B2 (en) * 2017-06-15 2020-02-25 Microsoft Technology Licensing, Llc Compatible dictionary layout

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06266561A (ja) * 1993-03-11 1994-09-22 Hitachi Ltd プログラムの型検査方法およびシステム

Family Cites Families (6)

* Cited by examiner, † Cited by third party
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
EP1174791B1 (en) * 2000-07-10 2017-09-27 Microsoft Technology Licensing, LLC Unified data type system and method
US20030131347A1 (en) * 2001-10-12 2003-07-10 Allison David S. Method and apparatus for runtime binding of object members
US7644402B1 (en) * 2004-03-17 2010-01-05 Sun Microsystems, Inc. Method for sharing runtime representation of software components across component loaders
US20060048095A1 (en) * 2004-08-31 2006-03-02 Microsoft Corporation Local type alias inference system and method

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06266561A (ja) * 1993-03-11 1994-09-22 Hitachi Ltd プログラムの型検査方法およびシステム

Also Published As

Publication number Publication date
JP5044139B2 (ja) 2012-10-10
US7810077B2 (en) 2010-10-05
US20060236315A1 (en) 2006-10-19
EP1722300A1 (en) 2006-11-15

Similar Documents

Publication Publication Date Title
JP5044139B2 (ja) 移行互換性を維持したままのジェネリック型の具体化
US6018628A (en) Method of implementing parameterized types to be compatible with existing unparameterized libraries
US9916134B2 (en) Methods and systems for accessing distributed computing components through the internet
US7793256B2 (en) Methods and systems for supporting and deploying distributed computing components
US6286134B1 (en) Instruction selection in a multi-platform environment
KR101795844B1 (ko) 런타임 시스템
US8448132B2 (en) Systems and methods for modifying code generation templates
US9395963B1 (en) System and method for accessing meta-data in a dynamically typed array-based language
JP2007012066A (ja) ローカル及び匿名クラスに対するイントロスペクションサポート
US6895581B1 (en) Replaceable classes and virtual constructors for object-oriented programming languages
US6345387B1 (en) Coherent object system architecture
JP2007012064A (ja) 非ジェネリック化方法がジェネリック化方法をオーバーライドすることの許可
US20090320007A1 (en) Local metadata for external components
US9311111B2 (en) Programming environment with support for handle and non-handle user-created classes
US7526752B1 (en) Introspection support for generic types
US20060080644A1 (en) Parameterization of programming structures
US7802239B2 (en) Supporting method references in the JAVA language
US7673051B2 (en) Resource usage conflict identifier
WO2008015110A2 (en) Methods, apparatus and computer programs for modelling computer programs
Vernon D3. 2 Software Engineering Standards Manual
Mellor Embedded systems in UML
CN117519848A (zh) 一种函数调用方法、装置、设备及存储介质

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20090417

RD03 Notification of appointment of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7423

Effective date: 20110113

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20110118

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120321

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120620

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20120703

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20120713

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

Ref document number: 5044139

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20150720

Year of fee payment: 3

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250