2013-08-12 3 views
5

私はAngelikaLangerGenericsFaqから複数レベルのワイルドカードを読んでいます。私はかなり構文を約 混乱しています。文書はマルチレベルワイルドカードとは何ですか?構文の混乱

言うタイプCollection<Pair<String,?>>は ジェネリックコレクションインターフェイスの具体的なインスタンス化したものです。これは異なるタイプの ペアの異種コレクションです。これには、 Pair<String,Long>,Pair<String,Date>,Pair<String,Object>, Pair<String,String>などの要素を含めることができます。換言すれば、 Collection<Pair<String,?>>は、異なるタイプの対の混合物( 、形式:Pair<String,?>)を含みます。

タイプCollection<? extends Pair<String,?>>はワイルドカード です。それは具体的なパラメータ化された タイプを表していません。 Collection の引数がPair<String,?>の形式であるコレクションインターフェイスのインスタンス化であるコレクション のファミリーの代表を表します。互換性のあるインスタンス化 は、Collection<Pair<String,Long>>,Collection<Pair<String,String>>, Collection<Pair<String,Object>>またはCollection<Pair<String,?>>です。 他の言葉では、私たちはそれが というCollectionのインスタンス化の略語を知らない。

経験則として、複数レベルのワイルドカードをトップダウンで読む必要があります。

次の点については混乱します。

  1. 例では、これらの3つの引用符で詳しく説明できますか。私は完全に構文に失われています
  2. ドキュメントは、para-1はジェネリック型の具体的なインスタンス化であり、その他は具体的なインスタンス化ではないと言いますか?それはどうですか?
  3. ワイルドカードをトップダウンで読むことは何を意味しますか?
  4. マルチレベルワイルドカードの利点は何ですか?

誰かがこれらの点を詳述できますか?ありがとう。

答えて

11

例では、これらの3つの引用符について詳しく説明できますか。私は完全に構文に失われている

まあ、ここで再び3つの引用符を書くことは意味がありません。私はそれ以上の説明はできません。代わりに、私はあなたの以下の他の質問に答えようとします、そしておそらくあなたもこのことを理解するでしょう。そうでない場合は、再度照会を依頼することができます。私はもう少し詳しく説明しようとします。

Documentによれば、para-1はジェネリック型の具体的なインスタンス化であり、その他は具体的なインスタンス化ではありませんか?それはどうですか?

具体的なインスタンス化は、すべての型引数が具体的な型であり、コンパイル時に認識されるものです。例えば、Stringは具体的な型であるため、具体的なインスタンス化はList<String>です。型はコンパイル時に知られています。一方、List<? extends Number>は具体的なタイプではありません。? extends NumberNumberを拡張する任意のタイプです。コンパイル時には型が不明です。同様に、Map<String, Integer>は汎用タイプMap<K, V>の具体的なインスタンスです。マルチレベル型パラメータの場合

List<List<? extends Number>>要素のタイプは、コンパイル時にListあることが知られているので、インナーListのように、ワイルドカードのインスタンスであるが、外側Listは、List<E>の具体化です格納される要素のタイプは、Integer,Double、任意のサブクラスNumberとすることができる。しかし、その段落は外側のタイプについてのみ話しています。外側のタイプには、Listタイプしか含めることができません。 Pairの実際の型パラメータは何もすることができますので、最初の段落が言った理由です

は、それは、Pairの不均一なコレクションだが、それはPair何もないことは確かです。

ワイルドカードをトップダウンで読むこととはどういう意味ですか?

仮面ライダーの言葉で言えば、それは左から右への意味です。パラメータ化された型の型を決定する際には、まず一番外側の型のパラメータが見えます。その型パラメータ自体がパラメータ化された型の場合、そのパラメータ化された型の型パラメータに移動します。そこで、型パラメータを左から右へと読み込みます。

マルチレベルワイルドカードの利点は何ですか?

あなたは果物の一覧のリストを作成するとします。今あなたの内部Listは果物のあらゆる種類を含むことができます。 りんごもまたフルーツであり、バナナフルーツである。だから、あなたはそれらのすべてを得ることを確認する必要があります。現在、汎用タイプは不変なので、List<Apple>List<Fruit>と同じではないため、リストのタイプがList<List<Fruit>>の場合はList<Apple>を追加できません。そのためには、List<List<? extends Fruit>>のようなwildcardsを使用する必要があります。今度はList<Apple>List<Banana>というフルーツのリストを取ることができます。

+0

このような詳細な説明はありがとうございます。 Collection >を参照してください。具体的にどのように記述すれば、コンパイラは他の型がわからないでしょうか?どのようにしてそれを具体的に表現することができますか? – benz

+1

@benz。私はちょうどそれの説明を追加しました。編集を確認してください。 –

+0

すばらしい説明Rohit。ありがとうございました。私は同じトピックでもう少し疑問を抱いています。私は仕上げており、ここでそれらを追加することはかなり関連しているので、質問を編集します。 – benz

0

ワイルドカードを使用する一般的なタイプは、実際には「存在」タイプです。あなたがすべてのことをよく知っているなら、G< ? extends T >を∃ S extends T:G<S>と書くことができます。

「トップダウン」の読み方についての説明は、実際に?を含む型によって暗示された存在量限定子が常に?にできるだけ近いことを意味します。たとえば、G< H< ? extends T > >G<S extends T:H<S> >に精神的に書き換える必要があります。外側に量子がないので、それはコンクリートと呼ばれます。