[解決済み] Javaにおける<? super T>と<? extends T>の違い [重複]について
質問
とはどのような違いがあるのでしょうか?
List<? super T>
と
List<? extends T>
?
以前は
List<? extends T>
しかし、これでは要素を追加することができません。
list.add(e)
一方
List<? super T>
を行います。
どのように解決するのですか?
extends
のワイルドカード宣言は
List<? extends Number> foo3
は、これらのどれもが合法的な代入であることを意味します。
List<? extends Number> foo3 = new ArrayList<Number>(); // Number "extends" Number (in this context)
List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number
List<? extends Number> foo3 = new ArrayList<Double>(); // Double extends Number
-
読み方 - 上記のような割り当てが可能な場合、どのようなタイプのオブジェクトからの読み取りが保証されているか
List foo3
:-
を読むことができます。
Number
に割り当てられる可能性のあるリストのどれかが、このリストに割り当てられるからです。foo3
が含まれています。Number
またはそのサブクラスNumber
. -
を読み取ることはできません。
Integer
なぜならfoo3
を指している可能性があります。List<Double>
. -
を読み取ることはできません。
Double
なぜならfoo3
を指している可能性があります。List<Integer>
.
-
を読むことができます。
-
執筆 - 上記のような割り当てが可能な場合、どのようなタイプのオブジェクトを
List foo3
にとって合法的なものである。 すべて 上記の可能なArrayList
を割り当てます。-
を追加することはできません。
Integer
なぜならfoo3
を指している可能性があります。List<Double>
. -
を追加することはできません。
Double
なぜならfoo3
を指している可能性があります。List<Integer>
. -
を追加することはできません。
Number
なぜならfoo3
を指している可能性があります。List<Integer>
.
-
を追加することはできません。
にオブジェクトを追加することはできません。
List<? extends T>
がどのようなものであるか保証できないからです。
List
を指しているので、そのオブジェクトがその
List
. 唯一の "保証" は、そこから読み取ることだけが可能で、そのためには
T
またはそのサブクラスである
T
.
super
ここで、次のことを考えます。
List <? super T>
.
のワイルドカード宣言は
List<? super Integer> foo3
は、これらのどれもが合法的な代入であることを意味します。
List<? super Integer> foo3 = new ArrayList<Integer>(); // Integer is a "superclass" of Integer (in this context)
List<? super Integer> foo3 = new ArrayList<Number>(); // Number is a superclass of Integer
List<? super Integer> foo3 = new ArrayList<Object>(); // Object is a superclass of Integer
-
読み方 - 上記のような代入が可能である場合、
List foo3
:-
を保証するものではありません。
Integer
なぜならfoo3
を指している可能性があります。List<Number>
またはList<Object>
. -
が保証されているわけではありません。
Number
なぜならfoo3
を指している可能性があります。List<Object>
. -
は
のみ
のインスタンスを取得することが保証されています。
Object
またはそのサブクラスであるObject
(ただし、どのサブクラスかわからない)。
-
を保証するものではありません。
-
執筆 - 上記のような割り当てが可能な場合、どのようなタイプのオブジェクトを
List foo3
にとって合法的なものである。 すべて 上記の可能なArrayList
を割り当てます。-
を追加することができます。
Integer
なぜならInteger
は上記のどのリストでも許可されます。 -
のサブクラスのインスタンスを追加することができます。
Integer
のサブクラスのインスタンスはInteger
は、上記のどのリストでも許可されます。 -
を追加することはできません。
Double
なぜならfoo3
を指している可能性があります。ArrayList<Integer>
. -
を追加することはできません。
Number
なぜならfoo3
を指している可能性があります。ArrayList<Integer>
. -
を追加することはできません。
Object
なぜならfoo3
を指している可能性があります。ArrayList<Integer>
.
-
を追加することができます。
PECS
リメンバー PECS : 生産者は拡張し、消費者は拡張する。 .
-
"プロデューサーエクステンド" - が必要な場合は
List
を生成するためにT
の値(あなたが読みたいのはT
で宣言する必要があります。? extends T
は、例えばList<? extends Integer>
. しかし、このリストに追加することはできません。 -
"コンシューマースーパー" - が必要な場合は
List
を消費するためにT
の値を書きたい)。T
をリストに入れる) には、それを? super T
は、例えばList<? super Integer>
. しかし、このリストからどのような種類のオブジェクトを読み取ることができるかは保証されていない。 -
リストからの読み込みとリストへの書き込みの両方が必要な場合、ワイルドカードを使わずに正確に宣言する必要があります。
List<Integer>
.
使用例
備考
この例は、Java Generics FAQに掲載されています。
. ソースリスト
src
(生成リスト)は
extends
であり、宛先リスト
dest
(消費リスト) は
super
:
public class Collections {
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
for (int i = 0; i < src.size(); i++)
dest.set(i, src.get(i));
}
}
以下もご参照ください。 List<? extends Number> データ構造に追加するにはどうすればよいですか?
関連
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] wait()とsleep()の違いについて
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
final, finally, finalizeの違いについて話してください。
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
javaでクラスを作成すると、enclosing classでないように見える
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
-
JSPで「リストが型解決できない!」の解決方法
-
[解決済み】PECS(Producer Extends Consumer Super)って何?)