[解決済み] ポリモーフィズム。なぜ「ArrayList list = new ArrayList」ではなく、「List list = new ArrayList」を使うのか?重複
質問
重複の可能性があります。
なぜ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
クラスがあります。
全体として、選択は単にデザインの問題です...しかし、この種のデザインは非常に重要です(特に大規模なプロジェクトに取り組む場合)、既存のコードを壊すことなく、後で実装固有の変更を行うことが可能になります。
関連
-
プロローグでのコンテンツは禁止されています
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み】「インターフェースに合わせたプログラム」とはどういう意味ですか?
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
Javaクラスローダーにソースコードから潜り込む
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
spring aop アドバイスからの Null 戻り値が、サマリーのプリミティブ戻り値と一致しない。
-
IDEA パッケージステートメントの欠落
-
このラインで複数のマーカーを解決する方法