Javaのジェネリック配列:なぜ、このコンパイルを行い、これが意味するのでしょうか?

Srthkl23:

Javaは、直接一般的なアレイを作成することはできません。配列は、実行時に型チェックが必要なので、2に互換性がないのに対し、私は、その実行時に知られていないジェネリック型を消去するため、理解しています。

コードのこの作品はコンパイルされません -

Holder<Integer>[] integers = new Holder<Integer>[5];

ファイン、私は、なぜコードのこの部分は、実際に(危険な型変換のための警告で)コンパイルしないわからないのですか?

Holder<Integer>[] holders = new Holder[5];
holders[0] = new Holder<Integer>(5);
holders[1] = new Holder<Integer>(5);
holders[2] = new Holder<Integer>(5);

私は正確に私が実際にダイヤモンドのブラケットを除去することにより、コンパイラにをだましたのか理解していません。これは、一般的な配列を作成するために許容できますか?

私は、コードに次の行を追加するときにさらに、 - holders[3] = new Holder<String>("Hello");それは、コンパイル・エラーがスローされますHolder<String> can not be converted to Holder<Integer>私は、これは奇妙な見つけるためにこれまで私が配列のために型消去の2つの異なる一般的な種類を区別できなかったため、一般的な配列だった許可しないの全体的なアイデアを理解するよう。しかし、この例では、コンパイラが間違った型変換を検出することができます。

私はここで何をしないのですか?

スイーパー:

、このページの一般的な種類のアレイを作成が許可されていない正確な理由、あなたが見ることができます:

Object[] stringLists = new List<String>[];  // compiler error, but pretend it's allowed
stringLists[0] = new ArrayList<String>();   // OK
stringLists[1] = new ArrayList<Integer>();  // An ArrayStoreException should be thrown,
                                            // but the runtime can't detect it.

stringLists 必要がある唯一の店のことができるようにList<String>、しかし、上記のコードを使用することによって、私は私が保存できるようにするには、コンパイラが、また、ランタイムをだますことができないだけArrayList<Integer>stringLists消去を入力に起因するが、。

コードのこの作品は、実際にコンパイルしない理由が、私はわかりませんよ

まあ、理由はHolderある生タイプ参照してください生のタイプは何ですか、なぜ我々はそれを使うべきではないのですか?ここにあなたが「この配列のみ保存することができますと言っていないので、生型の配列を作成するには、限りコンパイラとランタイムに関しては、完全に大丈夫ですHolder<Integer>、あなただけのこの配列のみ保存することができます」と言っている、」Holder(の何でも)」。

これは、一般的な配列を作成するために許容できますか?

さて、あなたの配列は、技術的にジェネリックではありません。私はそれを割り当てることができますHolder[]し、割り当てるHolder<Foo>その要素の1つに、そして例外またはコンパイラエラーが発生しません。限りコンパイラが懸念しているように、これは「許容可能」ですが、型の安全性を失うので、私はあなたがそれを使用することはお勧めしません。あなたは、のようなものを使用する必要がありますArrayList<Holder<Integer>>代わりに。

これまで私は、配列が原因型消去の2つの異なる一般的な種類を区別できなかったため、一般的な配列を許可しないの全体的なアイデアだった理解として、私はこの奇妙な理由を見つけます。しかし、この例では、コンパイラが間違った型変換を検出することができます。

配列は、あなたがに置くことを許可していないため、コンパイラはそれを検出しないことができHolder<String>ますが、変数のコンパイル時の型であるためHolder<Integer>[]コンパイラは、コンパイル時の型を見て、種類を確認することができますが、できるだけ早くあなたが(型の変数に代入コンパイル時の型失うとしてObject[]またはHolder[])、それはあなたのためにそれを行うことはできません。配列自体はできますあらゆる種類のHolderことがあるので、とにかく最初の場所でしますHolder[]

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=229864&siteId=1