1. ホーム
  2. java

[解決済み] ゲットプットの原則の説明

2023-04-25 22:35:35

質問

オライリーの本を読み、その中でこのようなことを知りました。 取得の原則 .

  • を使用します。 extends のみを使用する場合は、ワイルドカードを使用します。 を取得します。 の値のみを取得する場合、ワイルドカードを使用します。
  • を使う。 super のみを使用する場合は、ワイルドカードを使用します。 を置く の値だけを構造体に入れることができます。
  • また、構造体から取得するときと構造体に入れるときの両方でワイルドカードを使わないでください。

例外 があります。

  • で宣言された型には何も入れられません。 extends という値を除いて、ワイルドカード null という値を除いて、ワイルドカードを使うことができます。

  • で宣言された型からは何も得ることができません。 super 型の値を除いて、ワイルドカード Object の値を除き、ワイルドカードが使用されます。

このルールを深く掘り下げるために、どなたか助けていただけないでしょうか?可能であれば、それらを階層的に配置してください。

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

バナナの束を考えてみましょう。これは Collection<? extends Fruit> であり、特定の種類の果物の集まりです。しかし、あなたは(その宣言から)それがどの種類の果物の集まりなのか知りません。あなたは 得る を得ることができ、それが間違いなく果物であることを知ることができます。 加える バナナの束にリンゴを加えようとするかもしれませんが、それは絶対に間違っています。あなたは 加える null の有効な値になるので、これに の有効な値になるからです。 の有効な値になるからです。

次にフルーツボウルを考えてみましょう。これは Collection<? super Banana> のように、ある種の "greater than" のコレクションであるという点で。 Banana (例えば Collection<Fruit> または Collection<TropicalFruit> ). あなたは 間違いなく にバナナを加えることができます。しかし、ボウルからアイテムを取ってくると、何が出てくるかわからないのです。 ではない はバナナではないかもしれません。あなたが確実に知っていることは、それが有効な(もしかしたら null ) Object を参照してください。

(一般に、Java ジェネリックスの質問では Java ジェネリクス FAQ は、あなたが投げかけそうなジェネリクス関連のほとんどすべての答えを含む、優れたリソースです)。