1. ホーム
  2. java

[解決済み] ポリモーフィズム。なぜ「ArrayList list = new ArrayList」ではなく、「List list = new ArrayList」を使うのか?重複

2022-04-27 04:55:36

質問

<ブロッククオート

重複の可能性があります。

なぜJavaクラスのインターフェイスを優先するのか?

どのような場合に使用するのでしょうか?

List<Object> list = new ArrayList<Object>();

ArrayList を継承しています。 List の一部の機能が ArrayList にはありません。 List の機能のいくつかを失ってしまうことになります。 ArrayList ということですよね?そして、これらのメソッドにアクセスしようとすると、コンパイラはエラーに気づくのでしょうか?

どのように解決するのですか?

これを行う主な理由は、インターフェースの特定の実装からコードを切り離すためです。このようにコードを書くと

List list = new ArrayList();  

残りのコードでは、データの型が List の異なる実装を切り替えることができるので、これは望ましいことです。 List インターフェイスを簡単に利用することができます。

例えば、かなり大規模なサードパーティライブラリを書いていたとして、ライブラリのコアを LinkedList . もしあなたのライブラリがこれらのリスト内の要素へのアクセスに大きく依存しているなら、いずれは設計上の判断が誤っていることに気づくことになるでしょう。 ArrayList (アクセス時間がO(1)になる)代わりに LinkedList (アクセス時間がO(n)になる)。インターフェイスを使ったプログラミングをしているのであれば、このような変更は簡単です。のインスタンスを変更するだけです。 List からです。

List list = new LinkedList();

になります。

List list = new ArrayList();  

で提供される契約に従うようにコードを書いたので、これがうまくいくことは分かっているはずです。 List インターフェイスを使用します。

一方、ライブラリのコアを LinkedList list = new LinkedList() なぜなら、残りのコードで LinkedList クラスがあります。

全体として、選択は単にデザインの問題です...しかし、この種のデザインは非常に重要です(特に大規模なプロジェクトに取り組む場合)、既存のコードを壊すことなく、後で実装固有の変更を行うことが可能になります。