2009-10-14 7 views
0

Essayer de faire quelque chose comme: méthodeListe de paramètres <? étend Interface1>

public interface Order {  
    public List<? extends OrderItem> getItems(); 
    public void setItems(List<? extends OrderItem> items); 
} 

public interface OrderItem { 
    // stuff 
} 

public class OrderItemImp implements OrderItem { 
    // stuff for class impl 
} 

public class OrderImp implements Order { 
    public List<OrderItemImp> getItems() { 
     return items; 
    } 
    public void setItems(List<OrderItemImp> items) { 
     this.items = items; 

    } 
} 

compilateur se plaindre de setItems. Comment puis-je faire ce travail? Merci.

Répondre

5

Dans votre définition d'interface Order, les méthodes ressemblent à une paire de méthodes get/set, c'est-à-dire logiquement une propriété. Dans ce cas, ils doivent avoir le même type. Vous devez les attacher ensemble via un paramètre de type nommé:

public interface Order<T extends OrderItem> {  
    public List<T> getItems(); 
    public void setItems(List<T> items); 
} 

Pas tout à fait sûr que ce soit la bonne syntaxe en Java, mais essentiellement les deux méthodes doivent finir par référence au même type exact.

+3

Et public class OrderImp implémente l'Ordre {'. –

+0

Parfait! Je vous remercie – Fedor

-1

essayez de remplacer

public void setItems(List<? extends OrderItem> items); 

avec

public <T> void setItems(List<T extends OrderItem> items); 

. Ceci est maintenant un generic method

+0

Et la mise en œuvre dans '' OrderImp' devrait être setItems (Liste ) 'aussi bien. Il n'y a pas de moyen (facile) de s'assurer que les éléments sont réellement 'OrderItemImp' et pas une autre implémentation de' OrderItem'. –

+1

Votre syntaxe n'est pas tout à fait correcte, elle devrait être 'public void setItems (Liste éléments);' – Lachlan

+0

-1 syntaxe invalide. En outre, ce changement n'a absolument aucun effet – user102008

Questions connexes