8

私は現在、Java OCA 試験の勉強をしていて、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 を宣言することも有効であると述べています。

また、このトピックに関する適切な記事をオンラインで見つけることもできません。誰かが上記のさまざまな順列を説明できますか (または、良い記事の方向性を教えてくれますか)?

前もって感謝します。

4

2 に答える 2

14

1 はすべてのバージョンの Java で有効です

ここでは、Generics を使用せずに ArrayList を宣言しています。これは、arraylist に何を追加しても、元に戻すと型になり、型Objectへのキャストが必要になることを意味します。これは、Java 1.4 (ジェネリック以前) でコレクションを使用する古い方法であり、下位互換性のためにサポートされています。最近では、常にジェネリックを使用する必要があります。


2 と 4 は Java 7 でのみ有効です

空括弧: <> は Java7 の新しい型推論であり、型を 2 回指定する必要がないことを意味します。Java7に注意してください。古いバージョンでは動作しません。

だからJava7で

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

と同じです

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

このリンクには型推論に関する詳細情報があります: http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html


Generics を使用している場合は、変数宣言で型を指定する必要があるため、3 は無効です。


Double 型の List を宣言すると、それに Float 型の List を割り当てることができず、Double 型のリストのみを割り当てることができるため、5 は無効です。

したがって、これは有効です:

ArrayList<Double> al5 = new ArrayList<Double>();
于 2013-03-01T10:36:16.220 に答える
2

以下の 2 が有効ですonly in Java SE7Java SE7では型推論が可能であるため、内部で再度型を指定する必要はありません<>

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

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

ArrayList al1 = new ArrayList();

Float の Collection は Double のコレクションのサブタイプではないため、以下は許可されません。さらに、Float は Double のサブタイプではありません。したがって、それが有効な宣言であることは間違いありません。配列バージョンでさえコンパイルされないことに注意してください。

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

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

ArrayList<> al3 = new ArrayList<>();
于 2013-03-01T10:46:46.360 に答える