2014-07-11 4 views
3

bien j'ai une classe qui a un membre défini comme:méthode générique ne reconnaît pas le type

Map<Class<? extends Model>, List<? extends Model>> mockStore; 

Je Dans cette classe une méthode:

protected <T extends Model> void insertMockStore(T obj) 
{ 
    mockStore.get(obj.getClass()).add(obj); 
} 

Mais cette méthode donne une erreur de compilation:

la méthode add (capture # 8 de? étend le modèle) dans la liste des types est pas applicable pour les arguments (T)

Je ne comprends pas cette erreur parce que T est défini comme extension du modèle, alors pourquoi dirait-il que T n'est pas applicable?

Répondre

6

Votre déclaration membre indique que les valeurs de mockStore seront des listes contenant une sous-classe non spécifiée * de Model.

La méthode insertMockStore fait de même, mais rien ne garantit que la sous-classe de Model passée à insertMockStore sera la même que les listes.

Ce que vous devez faire à la place est déclarer mockStore comme ceci:

Map<Class<? extends Model>, List<Model>> mockStore; 

Une règle facile à retenir de base est ici la « règle de PECS »: producteur étend, super consommateurs. Cela signifie que si votre membre possède une collection avec le paramètre de type Foo, toutes les méthodes de type producteur (celles qui insèrent dans votre collection) auront besoin de T extends Foo et toutes les méthodes de type consommateur (celles qui retournent des valeurs de la collection) doivent avoir T super Foo.

* Comme toujours avec les génériques, dans la "sous-classe" nous incluons la classe elle-même.

+3

Je savais que ce serait quelque chose de simple que j'ai raté. Merci pour la contribution! –

1

Votre mockStore a des valeurs List<? extends Model> donc il ne sait pas si vous pouvez y ajouter un T.

Une solution plus simple consiste à simplifier votre déclaration.

private final Map<Class, List> mockStore; 

@SuppressWarning("unchecked") 
protected void insertMockStore(Model obj) { 
    mockStore.get(obj.getClass()).add(obj); 
} 
+1

Mais je pense que le PO a besoin de – GingerHead

+0

@GingerHead pas dans l'exemple donné. Habituellement dans ces cas où les types d'éléments correspondent à la clé, vous finissez par utiliser l'effacement et l'appliquer dans les méthodes à la place. –

Questions connexes