2012-01-01 16 views
4

なぜコンパイラの問題にコンパイラの警告は、ジェネリック型を宣言するとき

として変数を宣言する警告を行い
List<? extends Object> list = new LinkedList(); 

警告:

Note: ZiggyTest.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 

しかし、私は

として変数を宣言するときには警告を発行しdoesntの
List<?> list = new LinkedList(); 
+0

Checkout http://stackoverflow.com/questions/8683137/and-extends-object/8683314とジェネリックスで作業するときに必ず読んでください私の答えに優れたジェネリックスチュートリアル – Robin

+0

これは、私のNetBeans 6.9.1でjdk 6で述べたように。 – Lion

+0

私はIDEを使用していません。コマンドラインプロンプトからコンパイルすると警告が表示されますか? – ziggy

答えて

1

コンパイラがこれを同等のものとして扱わない理由を説明することはできませんが、そうでないとすれば、私はなぜそれが拒否されるのか説明しようとします。

最初のもの(List<? extends Object>)は、Listに保持されているオブジェクトのタイプが、Objectから派生した不明なタイプのものであると主張します。 2番目のもの(List<?>)は少ないと言います。リスト内のオブジェクトのタイプが不明であるということだけです。予期しないスーパータイプは、未知の型の上限として言及されていません。

最初の仮定を確認するために、コンパイラはここで生成されたListインスタンスに保持されている予想される型について、生の型としてLinkedListと言うことを聞きたいと思っています。しかし、インスタンスLinkedList<Object>としてインスタンスを構築する場合は、インスタンスがアサーションと一貫していること、つまりこのリスト内のものが何らかの種類のObjectであることに対して、少なくともであることを保証しています。

Javaのすべての参照/非プリミティブ型がObjectに拡張されているため、List<? extends Object>List<?>の間に解釈上の違いはないはずです。結局のところ、第2のものは、言語の型システムの義務付けられた単一ルートの階層構造のために、最初のものを意味する。

2

これは、タイプ指定子なしのコレクションを使用している場合、Java 5以降で発生します(例えば、ArrayList<String>()の代わりにArraylist())。つまり、コンパイラは、genericsを使用して、コレクションを型安全に使用していることをチェックできません。

警告を取り除くには、コレクションに格納しているオブジェクトの種類を特定してください。次のようにあなたがその文を変更した場合ので、代わりに

List list = new ArrayList(); 

の、

お使いの場合には
List<String> list = new ArrayList<String>(); 

ようである必要があり、

List<? extends Object> list = new LinkedList<Object>(); 

それは警告なしでコンパイルしますので、現在、ジェネリック型(<Object>)を使用してタイプセーフな状態にしています。

+0

'新しいLinkedList <? extends Object>(); 'はコンパイルされません – Robin

+0

宣言でワイルドカードを使用することはできません。 – Voo

関連する問題