2009-10-05 9 views
3

Je travaille sur un projet, et je suis légèrement bloqué sur un aspect de celui-ci. J'ai besoin de créer une classe qui peut manipuler des collections d'instances d'autres classes. Dans ce cadre, il crée un objet wrapper pour chaque instance qui doit pouvoir non seulement contenir l'instance, mais effectuer certaines opérations dessus (y compris equals/hashcode). Donc, le constructeur prend non seulement l'objet enveloppé, mais aussi un objet fonction que l'appelant nous dit peut effectuer ces opérations de la manière souhaitée (ce qui peut différer du comportement natif pour les objets contenus). Par ailleurs, je sais que ce que je décris ici semble être une réinvention d'une partie du cadre des collections, mais j'ai simplifié ici.Génériques et collections - méthode indéfinie pour le type


public class MapWrapper<K,V> { 
    private class KeyWrapper<K> { 
     K key; 
     public KeyWrapper(K key) { 
      // ... 
     } 
    } 
    private class ValueWrapper<V> { 
     V value; 
     public ValueWrapper(V value) { 
      // ... 
     } 
    } 

    // ... 
    HashMap<KeyWrapper<K>, ValueWrapper<V>> map 
      = new HashMap<KeyWrapper<K>, ValueWrapper<V>>(); 
    // ... 

Tout semble bien se passer jusqu'à présent, mais je semble incapable d'ajouter des entrées à ma carte contient:


    public MapWrapper (HashMap<K, V> map) { 
     // ... 
     map.put(new KeyWrapper<K>(key), new ValueWrapper<V>(val)); 
     // ... 
    } 

Cela échoue compilation, avec ce message:

    "La méthode mise (K, V) dans le type HashMap < K, V > n'est pas applicable pour les arguments (HashPlus.KeyWrapper, HashPlus.ValueWrapper)

Et je suis à perte. Est-ce que ce type d'effacement est au travail? Je ne pense pas - tout est dans la même unité de compilation, et il ne descend pas à HashMap<Object,Object> - il tombe à HashMap<K,V>, ce qui semble étrange.

Pensées? Des pointeurs à des omissions criantes?

mise à jour et de la solution: Sur la base des recommandations de plusieurs intervenants, j'ai remplacé la ligne « ajouter » originale avec:


     this.map.put(new KeyWrapper<K>(key), new ValueWrapper<V>(val)); 

Et ce mon problème triés. Note: un répondant a suggéré que je n'ai pas besoin de paramétrer KeyWrapper et ValueWrapper sur la ligne de put, mais supprimer cela donne des avertissements de "type brut", donc je les ai laissés.

Merci à tous.

+0

utilisez-vous un IDE moderne comme Eclipse, Netbeans ou Intelli-J? Si vous l'étiez, vous ne devriez pas rester bloqué sur ce type de problème car ils offrent l'achèvement de la méthode et vous verriez que la méthode add() n'existe pas. – SteveD

+0

Mais j'ajouterais aussi que nous sommes tous allés là-bas à la recherche de la raison super compliquée d'un problème, trouvant à la fin que c'est quelque chose de stupidement facile ;-) – SteveD

+0

D'oh! En fait, j'utilise un IDE moderne - en particulier Eclipse ... et je l'ai encore manqué. Je pensais que c'était un problème de type. Merci. – CPerkins

Répondre

4
  1. il est put(..) pas add(..)
  2. vous essayez d'ajouter KeyWrapper et ValueWrapper au paramètre de la carte, pas le champ de la carte. Utilisez this.map.put(..)
  3. vous n'avez pas besoin de paramétrer KeyWrapper et ValueWrapper. K et V sont déjà disponibles par le biais MapWrapper
5

L'erreur dit tout. La méthode que vous cherchez est appelée put, et non add.

Questions connexes