2016-02-01 2 views
5

私がtestSuper()メソッドを呼び出せない理由をundestandしてください。コンパイルエラー:パラメータとしてextendとsuperを持つ無限のワイルドカード

The method testSuper(Group<? super BClass<?>>) in the type Group <BClass<String>> is not applicable for the arguments (Group<AClass<String>>) 

しかし、testExtends()メソッドはOKです。しかし、それは同じように見えます。

class AClass<T> {} 

class BClass<T> extends AClass<T> {} 

class Group<T> { 
    T name; 
    public void testExtends(Group<? extends AClass<?>> value){} 
    public void testSuper(Group<? super BClass<?>> value){} 
    public T getName(){return name;} 
} 

public class GenericTest { 

    public static void GenericTestMethod(){ 

     Group<AClass<String>> instGrA = new Group<AClass<String>>(); 
     Group<BClass<String>> instGrB = new Group<BClass<String>>(); 

     //OK 
     instGrA.testExtends(instGrB); 

     //The method testSuper(Group<? super BClass<?>>) in the type Group <BClass<String>> 
     //is not applicable for the arguments (Group<AClass<String>>) 
     instGrB.testSuper(instGrA); 

    } 
} 

答えて

3

コールに違いがあります。コンパイルの呼び出しで

instGrA.testExtends(instGrB); 

あなたはGroup<? extends AClass<?>>を期待している方法にGroup<BClass<String>>を渡します。これは、BClass<String>AClass<?>>のサブタイプであるため、BClassAClassのサブクラスであり、String?のサブタイプです。

しかし、コンパイルされません呼び出し、

instGrB.testSuper(instGrA); 

にあなたがGroup<? super BClass<?>>を期待している方法にGroup<AClass<String>>を渡します。これは一致しません。AClassBClassのスーパークラスですが、AClass<String>BClass<?>というスーパータイプではありません。

testExtendstestSuperのパラメータ内のワイルドカードは、ここで責任を負います。あなたのインスタンスでAClassBClassTに割り当てるので、それらを使用することができます。私たちはTを使用するGroupにこれらのメソッドの宣言を変更した場合、これはコンパイルするために取得することができます。

public void testExtends(Group<? extends T> value){} 
public void testSuper(Group<? super T> value){} 
+0

あなたの答えのおかげで、しかし、どのようなコールinstGrB.testSuper(instGrB)場合は? BClass は、BClass のタイプです。 –

+0

私の変更に伴い、その行がコンパイルされるようになりました。 – rgettman

+0

yes、それはコンパイルされます:) BClass がBClass のタイプであれば、質問がinstGrB.testSuper(instGrB)でコンパイルされないのはなぜですか?それとも? –

関連する問題