ゲットプット原理の説明


83

私はこのget-putの原則を知るようになったという点で、O'Reillyの本を読みました。

  • 構造体から値extendsのみを取得する場合は、ワイルドカードを使用します。
  • 構造体superのみを入力する場合は、ワイルドカードを使用してください。
  • また、構造体との間で取得および配置する場合は、ワイルドカードを使用しないでください。

例外は次のとおりです。

  • すべての参照型に属するextends値を除いて、ワイルドカードで宣言された型に何も入れることはできませんnull

  • すべての参照型のスーパー型であるsupertypeの値を除いて、ワイルドカードで宣言された型からは何も取得できませんObject

誰かが私がこのルールを深く探求するのを手伝ってくれる?可能であれば、階層的に配置してください。


4
+1:誰かが基礎について説明を求めるのを見るのはいつも嬉しいです
全員

2
@みんな、私はあなたが背側ではなく基本的な意味での基礎を意味すると思いますか?
リッチセラー

回答:


167

バナナの束を考えてみましょう。これは、Collection<? extends Fruit>特定の種類の果物のコレクションであるという点ですが、(その宣言から)それがどの種類の果物のコレクションであるかはわかりません。あなたはそれからアイテムを手に入れることができ、それが間違いなく果物になることを知っていますが、それに追加することはできません-あなたは間違いなく間違っているであろうバナナの束にリンゴを追加しようとしているかもしれません。どんな種類の果物に有効な値になるので、それに追加することができます。null

さて、フルーツボウルについて考えてみましょう。これは、Collection<? super Banana>「より大きい」タイプのコレクションであるという点で、ですBanana(たとえば、Collection<Fruit>またはCollection<TropicalFruit>)。これにバナナを追加することは間違いありませんが、ボウルからアイテムをフェッチすると、何が得られるかわかりません。バナナではない可能性があります。あなたが確かに知っているのは、それが有効な(おそらくnullObject参照になるということだけです。

(一般に、Javaジェネリックに関する質問の場合、Java Generics FAQは、ジェネリック関連のほとんどすべての質問に対する回答を含む優れたリソースです。)


ただし、Collection <?extends Fruits>からフルーツを取得している間は、バナナ以外のフルーツを取得できます。同様に、果物を入れている間、uはバナナの果物に属さないかもしれないものを追加するかもしれません
JavaResp 2009

6
JavaはCollection<? extends Fruit>、まさにその理由でnull以外のものをに追加することを防ぎます。そして、まさにそれらの理由で、アイテムをフェッチした結果を明示的にキャストする必要があります。
Jon Skeet

@JonSkeetこれはばかげた質問かもしれませんが、どのような場合に、add()メソッドとget()メソッドの両方に「アクセス」できないと便利ですか?つまり、リストからオブジェクトをget()するには、最初にそれを追加する必要がありますよね?逆に、後で入手できないのに、なぜ追加するのでしょうか。
ティモス2013年

7
@Timmos:何かが値を追加できる必要があるからといって、すべてのコードが追加できる必要があるという意味ではありません。たとえば、人の名前のリストを表示するには、Collection<? extends Person>(またはおそらく単にIterable<? extends Person>、しかし...)が必要な場合があります。そのコレクションを作成するコードはそれがである必要があるかもしれませんCollection<Employee>が、消費するコードはそうではありません。
Jon Skeet 2013年

5
@Timmos:この場合、「それ」が何を意味するのかを正確に言う必要があります...しかし、そうです、Javaジェネリックのルールは型の安全性を提供するように設計されています。
Jon Skeet 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.