1. ホーム
  2. java

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 がまだジェネリック クラスを理解できるようにすること) を可能にすることでした。

あなたが上で持っているように、実装で明示的に型情報を追加することができますが、それはリストが使用されるたびに追加のコードを必要とし、私の意見ではかなり厄介です。また、この場合、自分でチェックを追加しない限り、すべてのリストメソッドに対して実行時の型チェックが行われませんが、再定義されたジェネリックにより実行時の型が保証されます。