2012-03-20 7 views
6

私は、ワイルドカードは上限 なしで指定されている場合、これは」、その後、Object型の唯一の方法は に呼び出すことができる2つの部分の質問Javaのジェネリックのワイルドカードとその限界

マイブック状態を有しますワイルドカードタイプの値 "

これは何を意味するのかわかりません。これは何を意味するのでしょうか?

また、ワイルドカードタイプ(無制限かつ制限付き)の制限事項は何ですか?たとえば、MyClass<?>またはMyClass<? extends SomeOtherClass>への参照がある場合、その参照をどのような方法で呼び出すことはできません。ワイルドカードが私に何を許可するのか許可しないのか分かりません。これはおそらく私がその本の引用を理解できない理由です。

Iは、第二の部分のための例があります

class SomeOtherClass 
{ 
[...] 
} 

class MyClass<T> 
{ 
[...] 
} 

class Test 
{ 
    public static void main(String[] arg) 
    { 
     MyClass<? extends SomeOtherClass> myClass = new MyClass<String>() // for instance what does the wild card reference limit me to in any way. In a general sence. 
    } 
} 
+0

例を挙げて質問を明確にすることはできますか? –

答えて

9

ワイルドカード範囲(上下)は、多くの場合、パラメータ化された型のオブジェクトを返すコレクションとクラスのために必須です。

多くの場合、「プロデューサーエクステンション、コンシューマースーパー」を意味するPECSが表示されます。回答の重複を避けるため、the answer to this questionとお読みください。

  • あなたは、あなたがワイルドカードを使ったオブジェクトのタイプTheClassの少なくともあるコンパイラを言っている、<? extends TheClass>であなたのワイルドカードを定義する際に、より正確に。したがって、このオブジェクトをTheClassのインスタンスのように使用して、このタイプのすべてのメソッドを呼び出すことができます。

  • ワイルドカードを<? super TheClass>と定義すると、ワイルドカード型のオブジェクト型が実装されているか、TheClass型で拡張されていることがコンパイラに伝えられます。つまり、オブジェクトタイプがTheClassではない場合がありますが、TheClassオブジェクトをワイルドカード参照のインスタンスとして使用できます。したがって、オブジェクトの型は実行時にのみ認識されるため、そのオブジェクトでは何も呼び出すことはできませんが、ワイルドカードオブジェクトを待機するメソッドにオブジェクトを渡すことができます。

例:ノーマル

private void foo(List<?> list) { 
    Object o = list.get(0); // ok 
    list.add(new Object()); // won't compile! 

    // you cannot add anything, and only extract Object instances 
} 

private void foo(List<? extends TheClass> list) { 
    Object o1 = list.get(0); // ok 
    TheClass o2 = list.get(0); // ok 
    list.add(new Object()); // won't compile! 
    list.add(new TheClass()); // won't compile! 

    // You are sure that the objects are of a subtype of TheClass, 
    // so you can extract TheClass instances safely. However, you cannot 
    // add anything to this list since its type is not known (may be 
    // different from TheClass, so the compiler does not allow anything). 
} 

private void foo(List<? super TheClass> list) { 
    Object o1 = list.get(0); // ok 
    TheClass o2 = list.get(0); // won't compile! 
    list.add(new Object()); // won't compile! 
    list.add(new TheClass()); // ok 

    // You are sure that the objects are of a type implemented by TheClass, 
    // so you can add any TheClass instances to the list. However, you cannot 
    // extract TheClass objects since the objects type may be just implemented 
    // by TheClass, but different. 
} 
+0

私の本の中の声明が何を意味するのか分かりません、同じ文脈でそれを説明できますか? – rubixibuc

+0

あなたに理解できるようにコードスニペットを追加しました。 –

+0

文の中で、「Object型のメソッドはどういう意味ですか?それが私が混乱しているところです。 Objectクラスのメソッドを意味するのでしょうか? – rubixibuc

0

総称。

ArrayList<Man> list= new ArrayList<Man>(); 
list.put(man); 
Man m = list.get(0); 

上限とワイルドカードを使用する:

ArrayList<? extends Person> list= new ArrayList<? extends Person>(); 
list.put(man); //Man is a person.. 
Person p = list.get(0); 

は、ワイルドカードを使用して:あなたはワイルドカードを使用する場合は

ArrayList<?> list= new ArrayList<?>(); 
list.put(man); 
Object o = list.get(0); 

あなたはArrayListののジェネリック型を知ることができない、ので、あなただけのオブジェクトを取得することができますリストの中から、あなたはArrayListsを使用して元の形に戻っていることを意味します。

+0

私はすべてが指定された境界であると思っていました。オブジェクトだけでなく、上限が何であっても(一般的なものではなく、レフェルンのもの)抽出する。タイプ消去後のジェネリッククラスを考えてみましょう。したがって、私がMyClass を使用し、MyClassヘッダーがMyClass に等しい場合、MyClass の変数は意味があり、そのクラスだけがSomeOtherClassを返すことができます。その場合、クラスObjectのオブジェクトだけを抽出することはできません。 – rubixibuc

+1

いいえ、2番目の例はコンパイルされません。リストの型は 'Person'を拡張する' Woman'かもしれませんが '男。コンパイラが知ることができないので、2行目(.put()メソッドを使用するとき)ではコンパイルされません。 –

+0

この第2の例では、 'extends'の代わりに' super'を使用します。したがって、リスト型は 'Person'によって実装されたどの型でもかまいません。したがって、' Man'オブジェクトがそれに適合し、コンパイラはそれを受け入れます。これは 'PECS'のパラダイムです:オブジェクトを消費する(つまりリストに追加する)場合、' extends'ではなく 'super'が必要です;) –

0

たとえば、<がありますか?MyClass >ワイルドカードを拡張します。つまり、このワイルドカードに一致するクラスはすべて、MyClass型またはその子孫のいずれかである可能性があります。しかし、私たちがそれがMyClassの子孫であることを知っている唯一のことは、MyClassクラスで利用可能なメソッドを呼び出すことができるということだけを保証することができます。

boの上限を持つワイルドカードの場合<? >上限はObjectクラスになります。これは、クラスがObjectを継承していることだけがわかります。したがって、このクラスに存在することが保証されているメソッドだけが、Objectクラスで定義されたメソッドだけです。

関連する問題