2012-01-15 11 views

答えて

11

最初のものは、Java 7以降のみ有効で、かつある

List<String> list = new ArrayList<>(); 

ArrayList<String> list = new ArrayList<String>(); 

ArrayList<String> list = new ArrayList<>(); 

List<String> list = new ArrayList<String>(); 

それはちょうど、それほど冗長です。

ArrayList<String> list = new ArrayList<String>(); 

に相当する2つ目に、したがって厳密に等価である第一、同じ

あなたは、次の質問への回答で述べた理由のために、最初のものを好む必要があります。List versus ArrayList as reference type?

2

の発言には、2つのポイントがここにあります

1.新しいJava 7ダイヤモンド演算子は、あなたが可能に型パラメータを両側で指定せずにジェネリッククラスをインスタンス化する。したがって、これらの二つは等価です:

ArrayList<String> list = new ArrayList<String>(); 
ArrayList<String> list = new ArrayList<>(); 

2.より多くの重要なポイントは、最初の2つのインスタンス間の差です。もう一つは明確である:最初の一

ArrayList<String> list = new ArrayList<String>(); 

List<String> list = new ArrayList<>(); 

あなたはArrayListListのサブタイプであるため、割り当てが有効であるという事実を使用しています。しかし、新しいlistオブジェクトの上にあなただけの(あなたのオブジェクトは、すべての後にListとして宣言されているため)Listに含まれているメソッドのサブセットを持っていますが、ArrayListに存在する実装と。これは、オブジェクト指向プログラミングでは多態性と呼ばれ、さまざまな機能を提供するために、親が期待される親ではなく、クラスのサブタイプを使用することができます。

4

3は、やや等価です:上記で

List<String> list = new ArrayList<>(); 

、あなたがString要素を含んでおり、具体的なクラスArrayListとそれをインスタンス化しますListインタフェースを実装する変数を宣言しています。また、Java 7の新しいダイヤモンド構文を使用しています。<>の間にStringを再度書き込む必要はありません。上記で

ArrayList<String> list = new ArrayList<String>(); 

、あなたはString要素が含まれ、そしてあなたがStringタイプを指定することを義務付け、「伝統的な」構文を使用して、具体的なクラスArrayListとそれをインスタンス化します具象クラスArrayListの変数を宣言しています<>の間。上記で

ArrayList<String> list = new ArrayList<>(); 

、あなたはString要素が含まれており、具体的なクラスArrayListとそれをインスタンス化します具象クラスArrayListの変数を宣言しています。また、Java 7の新しいダイヤモンド構文を使用しています。<>の間にStringを再度書き込む必要はありません。

は、ダイヤモンドの構文(<>が)だけがジェネリックをインスタンス化するための従来の構文(<the-type>)を使用して立ち往生しているJavaの以前のバージョンのため、上記のJava 7で動作しますので注意してください。

最後の2つの形式は完全に同等です。 list変数がListタイプで、タイプがArrayListでないことを指定しているため、最初のフォームは少し異なります。良いオブジェクト指向のプラクティスではprogram to an 'interface', not an 'implementation'を指定する必要があるため、これが好ましいフォームです。

関連する問題