1

Javaのジェネリックスは、ソースコードがコンパイルされた後に型情報を消去します。そして、ジェネリック型が何であれ、Javaはクラスのコピーを1つしか保持しないため、「消去」が必要だと思います。つまりList<String>、またはList<Number>単に1つのリストです。次に、特定のクラスのコピーを1つだけ保持することを前提として、クラスのインスタンスが作成時にジェネリック型情報を格納する可能性があるのではないかと思います。

例:私たちが書くとき:

List<String> list = new List<String>. 

コンパイラは、リストに関連付けられた文字列のクラスオブジェクト(オブジェクトString.classを意味する)とともにリストのオブジェクトを作成します。これにより、汎用オブジェクトリストは、クラスオブジェクトを使用して実行時に型情報を確認できます。それは可能ですか、それとも実行可能ですか?

4

3 に答える 3

4

あなたが具体的に何を求めているのか完全にはわかりませんが、Javaがジェネリックスに消去を使用しなければならない大きな理由は下位互換性です。の振る舞いが

List list = new ArrayList(); //You can't do new list(), it's an interface

...バージョン間で変更されました。たとえばJava1.4からJava5にアップグレードすると、あらゆる種類の奇妙なことが起こり、コードが以前と同じように動作しなかったバグが発生する可能性があります。それが起こった場合、それは間違いなく悪いことです!

彼らが下位互換性を維持する必要がなければ、そうです、彼らは好きなことをすることができたでしょう-私たちは素晴らしい洗練されたジェネリックを持っていて、今はできない他のたくさんのことをすることができたでしょう。Javaで下位互換性のある方法で具体化されたジェネリックを許可するという提案がありましたが(Gafterによると思います)、ジェネリックであるはずのすべてのクラスの新しいバージョンを作成する必要がありました。それはAPIで多くの混乱を引き起こしたので、(良くも悪くも)彼らはそのルートをたどらないことを選択しました。

于 2011-08-06T10:55:08.193 に答える
3

私たちはList<String> l = new ArrayList<String>();java5から使用しています。以前はこのようではありませんでした。

まるでList l = new ArrayList();、ユーザーはInteger、String、またはユーザータイプのオブジェクトなど、何でも追加できます。したがって、Javaの人々は古いコードを変更したくありませんでした。したがって、コンパイル時にこれをチェックできるコンパイラーにそれを保持します。

于 2011-08-06T11:03:17.493 に答える
1

Java5より前のコードとのバイナリ下位互換性を維持するため。

于 2011-08-06T10:54:20.883 に答える