重複の可能性:
ArrayList 宣言 Java
Java では、ArrayList が List を使用して宣言されることが多いのはなぜですか?
List<String> strList1 = new ArrayList<String>();
ArrayList<String> strList2 = new ArrayList<String>();
これら2つの違いを理解できません。一方が他方よりも優れていますか?または特定の用途がありますか?
重複の可能性:
ArrayList 宣言 Java
Java では、ArrayList が List を使用して宣言されることが多いのはなぜですか?
List<String> strList1 = new ArrayList<String>();
ArrayList<String> strList2 = new ArrayList<String>();
これら2つの違いを理解できません。一方が他方よりも優れていますか?または特定の用途がありますか?
ArrayList
クラスはインターフェースを実装しますList
。
通常は、インターフェイスの型のオブジェクトを宣言し、もちろんそのインターフェイスの実装を使用してインスタンス化することをお勧めします。
このようにして、必要に応じて実装を変更できますが、宣言された型は変更されません。このようにして、特に変数をパラメーターとして取得するメソッドで、コードを変更しすぎないようにすることができます。List
メソッドは、特定の実装ではなく、パラメータとして取得し続けます。
Java では、インターフェース内のリストであり、ArrayList はそのインターフェースを実装するいくつかのクラスの 1 つです。最初の表記法の利点は、コードの残りの部分を変更することなく、使用する実装を簡単に変更できることです。たとえば、後で ArrayList の代わりに Vector を使用することにした場合は、コードを次のように変更できます。
List<String> strList1 = new Vector<String>();
基本的に、以前の返信では、ListをArrayListまたはListインターフェイスも実装している別のオブジェクトにアップキャストできると言っていたと思います。
コードをインターフェイスにバインドしたままにしておくと、必要に応じて実装クラスを非常に簡単に変更できます。
Concreteクラスでコーディングする場合は、コードをそのクラスにバインドすることで、そのクラスに固有の機能を使用できます。そして、将来の交換は困難になります。
機能を理解するには、サードパーティからのクラスをよく考えてください。コードを特定のベンダーに依存する必要はありません。必要に応じて、クラスを別のベンダーに変更できます。どちらもインターフェースにバインドされているため、変更は簡単です。
代用可能性は、オブジェクト指向プログラミングの原則です。コンピュータプログラムでは、S が T のサブタイプである場合、型 T のオブジェクトは型 S のオブジェクトに置き換えることができる (つまり、型 S のオブジェクトは型 T のオブジェクトに置き換えることができる) と述べています。そのプログラムの望ましい特性 (正確さ、実行されたタスクなど)。
ArrayList
のサブタイプですList
。
この質問については特にありませんが、参照を保持するためにクラスではなくインターフェイスを使用することを常にお勧めします。これにより、必要なときにいつでも実装を変更できます。たとえば、いつでもリンクリストに変更できます
ここでの考え方は、具体的なオブジェクト自体ではなく、インターフェイスを設計しているということです。strList1
インターフェイスは、必要にLinkedList
応じて後で に交換できるという意味でより柔軟です。