2012-02-29 8 views
2

私は私の質問は愚かな音ではないことを願っていますが、私はこの2行の違い何を知りたいのです:のJava:ArrayListの初期化(2つのコード行の間の差)

(私は牛という名前のクラスを作ったと仮定すると、 ..)

ArrayList<Cow> c1 = new ArrayList<Cow>(); 

ArrayList<Cow> c2 = new ArrayList(); 

あらかじめご説明いただきありがとうございます。

+0

javac -Xlintオプションを使用してコードをコンパイルして、コンパイラがそのことについて言いたいことを確認してください。 – Andy

+0

2番目のオプションを使用すると、これらの迷惑な警告が表示されます(例:)。 – Jerome

+0

2番目の属性を指定せずにjavacを使用しても何かが表示されました。ハイテクの詳細私はちょうどリスト自体が何らかの形で異なっているかどうかを知りたいのですが... – Popokoko

答えて

7

現在、type erasureのため、本質的に違いはありません。最初の形式が好ましい。 2番目の形式はraw形式を使用し、古いバージョンのJavaとの下位互換性のためにのみサポートされています。良いコンパイラを使用すると警告が表示されます。 the Java Language Specification, Third Edition, §4.8として

は説明する:

生タイプの使用が唯一のレガシーコードの互換性への譲歩として許可されています。ジェネリック性がJavaプログラミング言語に導入された後に作成されたコードでは、生の型を使用することはお勧めしません。 Javaプログラミング言語の将来のバージョンでは、未処理の型の使用を禁止する可能性があります。

(元の強調)。

+0

hm持っています!だからあなたはリスト自体がbasiclly同じ、よく説明された仲間であると言った:) – Popokoko

1

ruakhがちょうど指摘したように、最初のものが優先され、実際には実行の違いはありません。

はシンプルな言葉で説明: は両方のラインでは、あなたが のリストでそれをインスタンス化最初の行で のリストを宣言しています。 2番目の例では、Objectのリストでインスタンス化します。 Cowオブジェクトのサブクラスです。

リストインターフェイスリストとして宣言する方が良いでしょう。

List<Cow> listOfCows = new ArrayList<Cow>(); 
関連する問題