2016-02-01 17 views
5

Aiutatemi per favore a capire perché non posso chiamare il metodo testSuper()? Errore di compilazione:Caratteri jolly illimitati con extends e super come parametri

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

Ma il metodo testExtends() OK. Tuttavia, sembra lo stesso.

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); 

    } 
} 

risposta

3

C'è una differenza tra le chiamate.

Nella chiamata che compila,

instGrA.testExtends(instGrB); 

si passa un Group<BClass<String>> a un metodo che è in attesa di un Group<? extends AClass<?>>. Ciò corrisponde perché BClass<String> è un sottotipo di AClass<?>> - BClass è una sottoclasse di AClass e String è un sottotipo di ?.

Tuttavia, nella chiamata che non viene compilato,

instGrB.testSuper(instGrA); 

si passa un Group<AClass<String>> a un metodo che è in attesa di un Group<? super BClass<?>>. Ciò non corrisponde, perché sebbene AClass sia la superclasse di BClass, AClass<String> non è un supertipo di BClass<?>.

I caratteri jolly all'interno dei parametri per testExtends e testSuper sono da biasimare qui. Poiché nelle tue istanze stai assegnando AClass e BClass a T, puoi utilizzarli. Posso ottenere questo per compilare se cambiamo le dichiarazioni di questi metodi in Group utilizzare T:

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

Grazie per la risposta, ma cosa succede se chiamata instGrB.testSuper (instGrB)? BClass è un tipo di BClass . –

+0

Con le mie modifiche, quella linea ora viene compilata. – rgettman

+0

sì, compila :) La domanda è perché non si compila con instGrB.testSuper (instGrB), se BClass è un tipo di BClass ? O no? –

Problemi correlati