2008-11-24 8 views
0

J'ai un tas d'interfaces génériques et des classesPourquoi cette pile d'interface générique ne fonctionne-t-elle pas?

public interface IElement { 
// omited 
} 

class Element implements IElement { 
// omited 
} 

public interface IElementList<E extends IElement> extends Iterable { 
    public Iterator<E> iterator(); 
} 

class ElementList implements IElementList<Element> { 

    public Iterator<Element> iterator() { 
     // omited 
     } 
} 


public interface IElementListGroup<E extends IElementList<? extends IElement>> { 
    public E getChosenElementList(); 
} 


class ElementListGroup implements IElementListGroup<ElementList> { 
    public ElementList getChosenElementList() { 
     // omited 
    } 
} 

Et puis un simple code

ElementListGroup group; 

for(Element e : group.getChosenElementList()) 
{ 
// omited 
} 

Et la ligne avec pour mot-clé throwe un « ne peut pas convertir type d'élément objet à l'élément » erreur du compilateur .

Merci d'avance.

Répondre

7

IElementList doit mettre en œuvre Iterable<E>. Sinon, l'interface spécifie Iterator iterator(), et non Iterator<E> iterator(). Cela fait penser au compilateur que vous itérez plus de Object s.

J'ai fait ce changement, et il compilé bien (après avoir ajouté des retours null).

+0

Je suis surpris que le compilateur ne mord pas la tête de l'OP au large sur l'utilisation d'un type brut. Ou peut-être que le PO a l'habitude d'ignorer les avertissements, auquel cas ils méritent ce qu'ils obtiennent. :-P –

+0

Il y a plus d'avertissements rawtype dans le javac JDK7. –

0

Votre fonction retourne un ElementList pas un élément, et ElementList n'est pas un élément itérables sur

Questions connexes