違いは、ジェネリックと呼ばれる言語機能にあります。これについては、こちらの 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>
。