2012-08-13 4 views
0

j'ai essayé la ligne ci-dessous:Erreur dans Java Generics

HashMap <Temp,<? extends Action> > p= new HashMap<Temp, <? extends Action>>() 

Eclispe me donne une erreur

marqueurs multiples à cette ligne - Erreur de syntaxe sur jeton "", type attendu après ce jeton - erreur de syntaxe sur jeton "", type attendu après ce jeton

Des raisons pour lesquelles j'obtiens cette erreur et comment l'enlever?

+0

Veuillez reformater. Cela ne s'affiche pas correctement. – jn1kk

+0

N'utilisez pas '<>' autour de '? étend Action ... et vous serez plus près d'avoir raison. –

+1

L'erreur n'est pas dans Java Generics. –

Répondre

-4

Programmez les interfaces!

Map<Temp, ? extends Action> p = new HashMap<Temp, ? extends Action>(); 

Sa meilleure pratique.

J'ai remarqué que ce n'était peut-être pas répondu correctement. Le problème est expliqué en détail here. Ce qui fonctionnera pour vous est peut-être

Map<Temp, ? super Action> p = new HashMap<Temp, Action>(); 

Hope that helps.

Troisième édition, je suis nouveau pour écrire des commentaires noter que si ce processus est un exemple de toute façon ici:

public void doSomething() 
{ 
    Map<A, ? super A> p = new HashMap<A, A>(); 

    A a1 = new A(); 
    A a2 = new A(); 

    // AS A CONSUMER 
    // Not a problem because at runtime we'll know we can accept A. 
    p.put(a1, new B()); 
    p.put(a2, new C()); 

    // AS A PRODUCER 
    // what do I cast to? No way of knowing if its B or C. 
    for (Object a : p.values()) 
    { 
    } 

    // Same deal as above is it B or C? 
    p.get(a1); 
} 

class A{} 

class B extends A {} 

class C extends B {} 
+6

Vous ne pouvez pas instancier un type avec un argument générique. – Jeffrey

+0

Pourquoi '? super action'? N'est-ce pas différent de la variable que l'OP essaie d'assigner? –

+0

Il s'agit essentiellement de ce que vous voulez faire avec la carte. Si vous voulez ajouter des éléments (la liste est un producteur), alors à l'exécution avec vous ne pouvez pas connaître la classe spécifique que vous ajoutez à l'exécution, donc vous ne pouvez pas ajouter. Si vous voulez lire dans la liste (liste est un consommateur) le garantira que l'Action ne peut être autorisée que dans la liste. Une meilleure explication est disponible dans le lien que j'ai fourni plus tôt ... – ramsinb

4

avoir ceci:

HashMap <Temp, ? extends Action > p= new HashMap<Temp, *>(); 

Vous avez besoin de deux types pour une carte. Tapez pour la clé et un type pour la valeur. Vous ne pouvez pas entourer le second type (valeur) avec < & > car ce n'est pas autorisé.

Je recommande également la programmation à une interface, notez le type déclaré est une interface:

Map<Temp, ? extends Action > p = new HashMap<Temp, ? extends Action>(); 

EDIT

Comme il est indiqué, vous ne pouvez pas instancier une variable avec un type générique générique. S'il vous plaît changer * pour le type dont vous avez besoin.

+0

+1 pour la programmation sur une interface –

+3

Vous ne pouvez pas instancier un type avec un argument générique. – Jeffrey

2

Cela compilera:

Map<Temp, ? extends Action> p = new HashMap<Temp, Action>(); 

Ou avec Java 7:

Map<Temp, ? extends Action> p = new HashMap<>(); 

Vous avez eu < et > supplémentaire dans le type de valeur PARAM er, provoquant une erreur de syntaxe. Passé cela, you can't instantiate a generic type using a wildcard as a type parameter.

Vous remarquerez également que j'ai changé la variable à Map au lieu de HashMap - il est bon de program to interfaces au lieu de mises en œuvre, comme winged's answer mentions.