2017-03-29 5 views
1

私はワイルドカードを見ており、とても簡単な方法でそれらを理解しています。 <? extends Type>私は単純なワイルドカード使用ミスの理解

interface P<T> { 
    boolean eval(T e); 
} 

public class IsZero implements P<Integer> { 
    public boolean eval(Integer e) { 
     return e.intValue() == 0; 
    } 
} 

public class QQ<T> { 
    public void filter(Q<T> q1, Q<T> q2, P<T> p) { 
     while (!q2.isEmpty()) { 
      T tmp = q2.remove(); 
      if (p.eval(tmp)) { 
       q1.add(tmp); 
      } 
     } 
    } 
} 

ので、このコードは、与えられた(ParameterTypeに)書き込みのためにそれを使用していたとき、私はちょうど(戻り値の)と<? super Type>を読み取るためにそれらを使用。私はこれに同意するが、それはP<? super T>だ理由evalはブール値を返しますので、私は把握カントます

/* 
Q<? super T> q1 just used as a Parametertype for writing (add) 
Q<? extends T> q2 just used as a Returntype for reading (remove) 
P<? super T> p just used as Parametertype (eval) 
*/ 

:私の教授は、次の解決策を書きましたか?または、Return/Parameterの全体が間違っていますか?

+0

Q q1、q2、およびpにはIntegerのサブクラスを含めることができ、整数自体だけでなく、T = Integerの場合もあるためです。 – Wietlol

+0

申し訳ありませんが、サブクラスではありませんが、親:D – Wietlol

答えて

0

pとq1は両方がハンドルにできるようにする必要がありますので...同じ理由Q<? super T>するTの任意のインスタンスを必要としますが、Tまたはそのスーパーのいずれかを処理することができれば、あなたはそれで良いです尊敬するだからQ<T>の代わりにQ<? super T>に設定する理由は、あなたのコードを可能な限り一般的なものにすることです。 X > Yは、XがYまたはY自体のスーパークラス/インタフェースであり、pはQ<A>であることを意味している場合

それを置くための別の方法...、q1はQ<B>とQ2であるA > Cいる状態上記Q<C>

制約でありますABの関係に関係なく、B > Cです。それらのうちの少なくとも1つがインタフェースである場合、全く関連しない可能性があります。

メソッド呼び出しが対象を変更するかどうかは関係ありません。

ほとんどのJava標準コレクションクラスでは、クラスaddは、操作がコレクションを変更したかどうかを示すbooleanを返します。これはほとんどの場合無視されます。だからそれはまったく関係がありません。

関連する問題