型消去を実行する必要がなくなるようにJavaを改善するにはどうすればよいですか?


16

ジェネリック医薬品の公式のJavaチュートリアルでは、型消去を説明し、なぜそれがコンパイラに追加されました。

ジェネリック型がインスタンス化されると、コンパイラーは型消去と呼ばれる手法でこれらの型を変換します。コンパイラーは、クラスまたはメソッド内の型パラメーターと型引数に関連するすべての情報を削除するプロセスです。型消去により、ジェネリックを使用するJavaアプリケーションは、ジェネリックの前に作成されたJavaライブラリおよびアプリケーションとのバイナリ互換性を維持できます。

これはおそらく実用的なアプローチであるか、おそらく最も痛みの少ないアプローチでした。しかし、ジェネリックは業界全体で広くサポートされているので、型消去を必要としないために何ができるでしょうか?後方互換性を壊す必要なく実行可能ですか?それが実行可能であれば、実用的ですか?

上記の引用の最後の文は自己参照になりましたか?つまり、「型消去により、ジェネリックを使用するJavaアプリケーションは、型消去を実行するJavaバージョンで作成されたJavaライブラリおよびアプリケーションとのバイナリ互換性を維持できます。」


1
Sun 1.4は廃止されました。IBMは、引き続きプラットフォームで1.4をサポートしています。

@ThorbjørnRavnAndersen:少なくとも父の地下にあるプラットフォームには、 1.5 はありません
ヨルグWミットタグ

@ThorbjørnRavnAndersenそれだけでなく、JVMの以前のバージョンの拡張サポートも購入できます。最後に聞いたのは、かなり高価なことです。
maple_shaft

1
ここにいる私たちは誰も水晶玉を持っていないので、答えられません。「Will there ever ...」の質問から「Javaの将来のバージョンでType Erasureを実行するために何を達成する必要があるか」という質問を言い換えると、おそらく再開される可能性があります
maple_shaft

@JörgWMittagは、2012年に実際に運用に使用されるプラットフォームでしょうか?

回答:


7

サポート終了は、Java Development ToolkitおよびJava Runtime Environmentに適用されます。そして、Oracle(Sun)バージョンのみ。ただし、サードパーティが作成したアプリケーションには適用されません。意図は、JVMで実行したことがあるコードを決して壊さないことです。したがって、Javaが型消去の実行を停止することはほとんどありません。

もちろん、C#は、型消去を行わずに下位互換性のある方法で後のバージョンでジェネリックを導入しましたが、基本的にはすべてのコレクションクラスを複製することを意味していました。私が思うに、これはJavaデザイナーがしたくないことであり、そもそも彼らがタイプ消去を選択した理由です。値型がなければ、型消去されていないジェネリックの利点はそれほど大きくありません。


6
OpenJDKチームは、具体化されたGenericsの再検討について議論しましたか?Java 9の時間枠で真剣に検討される可能性が最も高く、技術的に実現可能であれば、Java 10の時間枠で配信されます。しかし、これは私の側の重大な予言です。
マーティンヴェルブルグ

型の消去は、JVMではなくコンパイラによって行われます。具象化されたジェネリックを導入するには、新しいコンパイラと新しいJVMが必要になりますが、おそらく古いコードでも機能するでしょう。
ゲイブ

@Gabe:明らかに新しいリリースで導入されるので、新しいコンパイラと新しいJVMがあります。ただし、標準コードのかなりの部分を複製する必要もあります。新しいコードには汎用バージョンが必要であり、下位互換性には非汎用バージョンが必要だからです。.NETはバージョン2.0でそれを行いましたが、Javaは消去によってそれを回避しました。.NETには値の型(構造体)があり、それらに対するファーストクラスのサポートにより、型の消去が禁止されています。Javaはそうではないので、具体化されたジェネリックに対する圧力ははるかに小さくなります。
ジャン・ヒューデック

Jan:ジェネリックを具体化しても、すべての古いコードが壊れることを自動的に意味するわけではないという事実について私はコメントしていました。また、List<int>おそらく現在のワークロードよりもワークロードの効率がはるかに高くなると付け加えList<Integer>ます。
ゲイブ

@Gabe:私たちはそれに同意しません。主な欠点に注目したかっただけです。
ジャン・ヒューデック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.