78

この件に関するNeal Gafter のブログを読みましたが、まだ多くの点で不明です。

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 実装の変更だけでなく、言語の変更が必要になるのはなぜですか?

私は何を理解していませんか?

4

5 に答える 5

21

大多数の Java 開発者の信念に反して、非常に制限された方法にもかかわらず、コンパイル時の型情報を保持し、実行時にこの情報を取得することが可能です。言い換えれば、Java は非常に制限された方法で具体化されたジェネリックを提供します

型消去について

コンパイル時に、コンパイラは完全な型情報を利用できますが、この情報は通常、バイナリ コードが生成されるときに型消去と呼ばれるプロセスで意図的に削除されることに注意してください。これは、互換性の問題によりこのように行われます。言語設計者の意図は、プラットフォームのバージョン間でソース コードの完全な互換性とバイナリ コードの完全な互換性を提供することでした。別の方法で実装した場合、新しいバージョンのプラットフォームに移行するときに、レガシー アプリケーションを再コンパイルする必要があります。この方法では、すべてのメソッド シグネチャが保持され (ソース コードの互換性)、何も再コンパイルする必要はありません (バイナリ互換性)。

Javaの具体化されたジェネリックについて

コンパイル時の型情報を保持する必要がある場合は、匿名クラスを使用する必要があります。ポイントは、匿名クラスの非常に特殊なケースでは、実行時に完全なコンパイル時の型情報を取得できることです。つまり、具体化されたジェネリックです。

私はこの主題について記事を書きました:

http://rgomes-info.blogspot.co.uk/2013/12/using-typetokens-to-retrieve-generic.html

この記事では、ユーザーがこの手法にどのように反応したかを説明します。一言で言えば、これはあいまいな主題であり、その手法 (または必要に応じてパターン) は、大多数の Java 開発者にとって無関係に見えます。

サンプルコード

上記の記事には、アイデアを実行するソース コードへのリンクがあります。

于 2011-01-27T04:08:58.633 に答える