Reified Genericsとは何ですか?型消去の問題をどのように解決するのか、なぜ大きな変更なしに追加できないのか?
2023-08-10 13:17:13
質問
私が読んだのは ニール・ガフターの のブログを読みましたが、いくつかの点でまだ不明です。
なぜ、Java、JVM、および既存のコレクションAPIの現在の状態を考えると、型情報を保持するコレクションAPIの実装を作成することは不可能なのでしょうか?これらは、後方互換性が維持される方法で、Javaの将来のバージョンで既存の実装を置き換えることはできないのでしょうか?
例として
List<T> list = REIList<T>(T.Class);
ここで、REIListはこのようなものです。
public REIList<T>() implements List {
private Object o;
private Class klass;
public REIList(Object o) {
this.o = o;
klass = o.getClass();
}
... the rest of the list implementation ...
そして、メソッドはObject oとClass klassを使って型情報を取得します。
なぜジェネリッククラス情報を保持するためには、単なるJVM実装の変更ではなく、言語の変更が必要なのでしょうか?
私は何を理解していないのでしょうか?
どのように解決するのですか?
要点は、再定義されたジェネリックには型情報を保持するためのコンパイラのサポートがあるのに対し、型消去されたジェネリックにはないことです。AFAIK は、そもそも型消去を持つことの要点は、下位互換性 (たとえば、低バージョンの JVM がまだジェネリック クラスを理解できるようにすること) を可能にすることでした。
あなたが上で持っているように、実装で明示的に型情報を追加することができますが、それはリストが使用されるたびに追加のコードを必要とし、私の意見ではかなり厄介です。また、この場合、自分でチェックを追加しない限り、すべてのリストメソッドに対して実行時の型チェックが行われませんが、再定義されたジェネリックにより実行時の型が保証されます。
関連
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
java 365*1000*60*60*24 計算問題
-
[解決済み] Javaでリストを反復処理する方法
-
[解決済み] enumとは何か、なぜ有用なのか?
-
[解決済み] Java 8のインターフェイスメソッドで "final "が使えないのはなぜですか?
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
-
[解決済み] Java の型消去のメリットは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
無効な文字定数
-
Javaジェネリックを1つの記事で
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
java.sql.SQLException: 結果セットの開始前
-
アノテーション「@Retention」の役割
-
[解決済み] タイプの安全性。アンチェック・キャスト
-
[解決済み] C#とJavaのジェネリックス(重複)
-
[解決済み] なぜJavaにreified genericsがないことを気にしなければならないのか?