重複の可能性:
参照型としてのリストと ArrayList?
List l = new ArrayList() と ArrayList al = new ArrayList() の宣言の違いは何ですか
重複の可能性:
参照型としてのリストと ArrayList?
List l = new ArrayList() と ArrayList al = new ArrayList() の宣言の違いは何ですか
List l = new ArrayList()
lを宣言すると、インターフェイス List によって提供されるメソッドに制限されますが、宣言するArrayList al = new ArrayList()
と、配列リスト内のすべてのメソッドとフィールドを使用できます。
それを宣言するとList l
、コードを壊さずに必要に応じて、後日 ArrayList をより適切なものに変更できるため、柔軟性が高まります。
編集
Chin Boon が指摘しているように、ArrayList にキャストl
して、ArrayLists のメソッドを使用できます。ただし、通常、ArrayList の特定の側面に依存している場合は、インターフェイス (List) をプログラミングする意味はほとんどありません。
List
(Interface
ArrayList、LinkedListのスーパータイプ)です。座っList l = new ArrayList();
ているときは、スーパークラス参照を使用してサブクラスオブジェクトを作成しているため、スーパークラスのメソッドのみにアクセスできますが、オーバーライドされたメソッドの場合、サブクラスメソッドが呼び出されます。
あなたの場合:
List l = new ArrayList()
リスト インターフェイス内で宣言されたメソッドとフィールドのみを呼び出すことができます。
ArrayList al = new ArrayList()
リストと配列リストの両方からメソッドとフィールドを呼び出すことができます。
アプローチ1を使用してarraylistを作成する場合も
List l = new ArrayList();
後で同じ参照を使用して、次のような LinkedList を作成できます
l = new LinkedList();
アプローチ2を使用することはできません:
ArrayList al = new ArrayList()
al = new LinkedList()// cannot do this
変数を List 型として宣言すると、その変数で何ができるかがコンパイラに正確に伝えられます。この場合、List インターフェイスで定義されたすべてのことを実行できます。ArrayList は List を実装しているため、ArrayList を List 変数に割り当てることはできますが、List インターフェイスで定義されているもの以外に ArrayList に他のメソッドが定義されている場合でも、List インターフェイスで定義されているものにしかアクセスできません。一方、型を ArrayList として宣言すると、List 型で定義されていなくても、ArrayList クラスで定義されたすべてのことを実行できます。ただし、後で変数を他のタイプのリストに再割り当てしたい場合は、コンパイラのタイプ チェッカーが ArrayList を必要とするため、それができません。