[解決済み] List<Dog> は List<Animal> のサブクラスですか?Java のジェネリックはなぜ暗黙のうちに多相性にならないのですか?
質問
Javaジェネリックがどのように継承/ポリモーフィズムを扱うのか、少し混乱しています。
以下のような階層を想定しています。
動物 (親)
犬 - 猫 (子供)
というメソッドがあるとします。
doSomething(List<Animal> animals)
. 継承とポリモーフィズムのすべてのルールによって、私は
List<Dog>
は
a
List<Animal>
と
List<Cat>
は
a
List<Animal>
- であるため、このメソッドにはどちらかを渡すことができます。そうではありません。この動作を実現するには、Animalの任意のサブクラスのリストを受け取るようにメソッドに明示的に指示する必要がある。
doSomething(List<? extends Animal> animals)
.
これがJavaの動作であることは理解しています。私の疑問は なぜ ? なぜポリモーフィズムは一般的に暗黙の了解になっているのに、ジェネリックになると指定しなければならないのでしょうか?
どのように解決するのですか?
いいえ
List<Dog>
は
ない
a
List<Animal>
. を使って何ができるかを考えてみましょう。
List<Animal>
- を追加することができます。
任意
猫も含まれます。さて、論理的に考えて、子犬の群れに猫を加えることができるでしょうか?絶対に無理です。
// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new ArrayList<Dog>(); // ArrayList implements List
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?
突然ですが、あなたは 非常に と戸惑う猫。
さて、あなたは
できない
を追加します。
Cat
に
List<? extends Animal>
であることを知らないからです。
List<Cat>
. 値を取得することで、その値が
Animal
しかし、任意の動物を追加することはできない。その逆は
List<? super Animal>
- を追加することができます。
Animal
しかし、そこから何が読み出されるかはわかりません。
List<Object>
.
関連
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
IllegalArgumentException この例外を解決する方法
-
SpringBootApplication を型解決できない。
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
linux run jarfile Invalid or corrupt jarfile error.
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
スレッド "main" で例外発生 java.net.BindException: アドレスは既に使用中です。NET_Bind
-
[解決済み] なぜList<T>を継承しないのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
Java Exceptionが発生しました エラー解決
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
spring aop アドバイスからの Null 戻り値が、サマリーのプリミティブ戻り値と一致しない。
-
javaでクラスを作成すると、enclosing classでないように見える
-
スレッド "main" で例外発生 java.net.BindException: アドレスは既に使用中です。NET_Bind
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res