2013-03-01 12 views
8

現在、Java OCA試験のために勉強しており、ArrayList宣言に関する質問があります。私の本によると、有効な次のJava ArrayList宣言

?:

1. ArrayList al1 = new ArrayList(); 
2. ArrayList al2 = new ArrayList<>(); 
3. ArrayList<> al3 = new ArrayList<>(); 
4. ArrayList<Double> al4 = new ArrayList<>(); 
5. ArrayList<Double> al5 = new ArrayList<Float>(); 

、1,2と4が有効で答えます。回答3と5は無効です。

ただし、適切な説明はありません。それがないすべては、ArrayListを宣言するために、標準的な方法を示している。

ArrayList<E> al3 = new ArrayList<E>(); 

をし、それが一般的な部分なしのArrayListを宣言することも有効だと言及しています。

また、このトピックに関するオンラインの記事を見つけることもできません。誰かが上記の異なる順列を説明することができますか(または良い記事の方向に私を指す)ことができますか?

ありがとうございます。

+2

一部のジェネリックはSOフォーマットで食べられていました。 – Vlad

+0

私は非常に混乱してくれました:P – cowls

+0

について3. '<>'は 'diamond operator'と呼ばれ、' java7'で導入されました。これは汎用オブジェクトのインストールのためのショートカットです。したがって、変数宣言ですでに指定されているため、 'new'を使用するときにタイプを指定する必要はありません。 – A4L

答えて

14

1ここでのJava

のすべてのバージョンでは、あなたがジェネリックを使用せずにArrayListに宣言されている有効です。これは、あなたがarraylistに何を追加するかにかかわらず、それが戻ってくるときにタイプObjectであり、タイプにキャストする必要があることを意味します。これは、Java 1.4(旧ジェネリック)のコレクションを使用する古い方法で、下位互換性のためにサポートされています。今日はジェネリックスを常に使用するべきです。


2と4は、Java 7にのみ

空のかっこ有効です。<>あなたは二度タイプを指定する必要がないことを意味しJava7の新しい型推論しています。注Java7、古いバージョンでは動作しません。あなたが使用している場合のでhttp://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html


3は無効です。

だから、Java7で

ArrayList<Double> al4 = new ArrayList<>(); 

は、このリンクをクリックすると、型推論の詳細情報を持っている

ArrayList<Double> al4 = new ArrayList<Double>(); 

と同じですGenericsでは、変数宣言で型を指定する必要があります。あなたはDouble型でリストを宣言する場合は、それにfloat型のあるリストを割り当てることはできません、あなただけのそれをタイプダブルのリストを割り当てることができますので、


5は無効です。

だから、これは有効な次のようになります。

2以下
ArrayList<Double> al5 = new ArrayList<Double>(); 
+0

お返事ありがとうございます。私は今、試験に出ても同様の質問に対処できると確信しています。 – user2123069

+0

問題はありません、試験には幸運を祈る – cowls

2

only in Java SE7有効になります。 Java SE7はタイプ推論を可能にしますので、<>の内部にタイプを提供する必要はありません。

ArrayList<Double> al4 = new ArrayList<>(); 
    ArrayList al2 = new ArrayList<>(); 

1以下の一方all Java versionsで有効です。非汎用コードの下位互換性を確保するためです。以下は

ArrayList al1 = new ArrayList(); 

フロートのコレクションは、ダブルのコレクションのサブタイプではないとして許可されていません。さらに、FloatはDoubleのサブタイプではありません。それが有効な宣言であるという質問はありません。 配列バージョンでもコンパイルできないことに注意してください。 1以下

Double[] dd = new Float[5]; //won't compile 
ArrayList<Double> al5 = new ArrayList<Float>(); //won't compile 

有効な宣言ではありません。

ArrayList<> al3 = new ArrayList<>();