0

次のように設定された arry リストを見てきました

private ArrayList<Student> students; //instance variable

public CollegeCommunity()//constructor

{
    students = new ArrayList<Student>();
}

そして、次のように

 ArrayList exampleArray = new ArrayList();

一方がインスタンス変数/コンストラクターを持ち、もう一方が単に宣言されている理由を理解していますが、最初が含まれ<Student>ていて、もう一方が含まれていない理由がわかりません<...> 。2つの違いは何ですか?

4

5 に答える 5

3

違いは、ジェネリックと呼ばれる言語機能にあります。これについては、こちらの Java チュートリアル トレイルで説明されています。

exampleArrayジェネリック クラスの生の型を使用して宣言されていArrayListます ...

生の型は、型引数のないジェネリック クラスまたはインターフェイスの名前です。

生の型にはジェネリック型情報がないため、ジェネリックが導入される前のクラスの使用と同じです。

一方、studentsジェネリックパラメーター化された型を使用します。

ジェネリック型は、型に対してパラメーター化されるジェネリック クラスまたはインターフェイスです。

ジェネリックは、コンパイラがより多くの型情報を持つことができるため、強い型付けを強制し、キャストを排除するために使用される型を効果的に推論できるようにすることで、プログラミングを容易にするという点で便利です。

rawArrayListは とほぼ同等ArrayList<Object>です。この違いは、Effective Javaで強調されています。

List生の型とパラメータ化された型の違いは何List<Object>ですか?

大まかに言えば、前者はジェネリック型チェックをオプトアウトしましたが、後者はコンパイラに、任意の型のオブジェクトを保持できることを明示的に伝えました。aList<String>を type のパラメーターに渡すことはできますが、 typeListのパラメーターに渡すことはできませんList<Object>。ジェネリックにはサブタイプ規則がありList<String>、生の型のサブタイプですがList、パラメーター化された型のサブタイプではありませんList<Object>

結果として、List のような生の型を使用すると型の安全性が失われますが、 のようなパラメーター化された型を使用する場合は失われませんList<Object>

于 2012-08-05T20:52:13.207 に答える
0

studentsジェネリックと呼ばれるものを使用しています。ジェネリックは、に渡すことができる型を制限しますArrayListexampleArrayタイプを指定しません。

于 2012-08-05T20:49:50.403 に答える
0

最初の ArrayList 宣言にはジェネリック型が定義されていますが、exampleArray には定義されていません。可能な場合は、ジェネリックを使用してキャストの必要性を回避することをお勧めします。

例えば

ArrayList<Student> students = ...;
Student student = students.get(0);

対:

ArrayList exampleArray = ...;
Example example = (Example)exampleArray.get(0);
于 2012-08-05T20:55:01.303 に答える
0

<Students>次の がある理由は、保持する のArrayListタイプを指定する必要があるためです。この場合、その人はクラスのデータ型を含む が欲しいと java に伝えています。dataArrayListArrayListStudents

これを行わないと機能しません。

于 2012-08-05T20:57:22.207 に答える
0

違いは、コンパイラへの単なるヒントです。この宣言は、指定されたコレクション内にクラスのnew ArrayList<Student>() インスタンスのみを格納するという事実を強制します。Studentこれにより、Java はstrong type-safetyジェネリックを使い続けることができます。

Java には型消去機能があるため、実行時に何も変更されませんが、この強力な制約が役立ちます。コレクションを宣言したときとは異なる時間でコレクションを使用しようとすると、コンパイラはエラーを発生させます。これは、パラメトリック ポリモーフィズムと呼ばれます。

raw 宣言new ArrayList()は代わりに、その中に保存しようとしているオブジェクトの型を想定していないリストをインスタンス化します。これは、すべてを保存できることを意味しますが、それらを取得するときにオブジェクトをキャストバックする必要があります。さらに、コンパイル時にコンパイラがコレクション内に挿入しようとするものをチェックできないため、型の安全性はありません。

于 2012-08-05T20:59:24.920 に答える