重複の可能性:
<の違いは何ですか?スーパーE>と<?E>を拡張しますか?
私が所属するチームの一部のJavaプログラマーは、型のオブジェクトを返しList<? extends T>
て読み取り専用リストを作成し、型のオブジェクトを返しList<? super T>
て書き込み専用リストを作成する関数を作成しています。
Javaでは、何がList<? extends T>
読み取り専用とList<? super T>
書き込み専用になるのですか?
重複の可能性:
<の違いは何ですか?スーパーE>と<?E>を拡張しますか?
私が所属するチームの一部のJavaプログラマーは、型のオブジェクトを返しList<? extends T>
て読み取り専用リストを作成し、型のオブジェクトを返しList<? super T>
て書き込み専用リストを作成する関数を作成しています。
Javaでは、何がList<? extends T>
読み取り専用とList<? super T>
書き込み専用になるのですか?
「プロデューサーエクステンド、コンシューマースーパー」(PECS)を読んでください-私は同じことをする必要があるかもしれません:)
読み取り専用:
メソッドが(ジェネリックを使用して)アイテムのコレクションをパラメーターとして受け取るようにしたい場合-使用する場合List<? extends T>
-リストにはTのサブタイプを含めることができますが、実行時に特定のサブタイプがわからないため、コレクションに追加できませんリストに含まれるTのタイプ。
書き込みのみ:
の場合List<? super T>
、実際のパラメータ化されたタイプに関係なく、リストにTを含めることができます(superを使用するとそれが可能になります)。
それが役に立てば幸い。
T
からを取得できますが、そこList<? extends T>
に入れることができるのはnull
リテラルだけです。T
にを入れることはList<? super T>
できますが、そこから取得できるのは()だけですObject
(これをキャストするのは安全ではありませんT
)。
したがって、制限により、これらは不完全ではありますが、意図を思い出させるものになります。を使用するList<? extends T>
と、ほとんどのものを入れることができないため、読み取り専用になります。そして、を使用するとList<? super T>
、それから物事を非常に便利に引き出すことができません-したがって、それはちょっと書き込み専用です。
これらのいずれも実際には読み取り専用でも書き込み専用でもないことに注意してください。上記で、物事を出し入れする方法のいくつかに注目しました。「読み取り専用」構造をremove
使用すると、オブジェクト自体またはそのイテレーターのいずれかで関数を呼び出すことができます。
定義List<? extends T>
は、「List<X>
実装、またはそのサブクラス/実装」を意味しX
ますT
。言い換えると、リストにすでに格納されているオブジェクトがタイプの変数に収まることが唯一の保証ですT
。ただし、リストは次のように宣言されている可能性があります。 Tを拡張または実装するクラスの場合、型T
自体のオブジェクトがリストに収まるという保証はありません。
簡単な例:List<String>
はList<? extends T>
ifT
ですObject
。そこからタイプオブジェクトを安全に描画できますが、他のタイプオブジェクトを確実に文字列でない限り、そこにObject
入れることはできません。Object