2010-03-21 4 views
2

Je reçois l'erreur de compilation suivante "La méthode putInstance (Class, T) dans le type MutableClassToInstanceMap ne s'applique pas aux arguments (Class, Number)" lors de l'appel à la méthode putInstance. Est-ce que quelqu'un sait ce que je fais mal ?? Merci!Erreur de compilation avec MutableClassToInstanceMap avec Generics

public class TestMutableClassToInstanceMap { 

    public final MutableClassToInstanceMap<Number> identifiers = MutableClassToInstanceMap.create(); 

    public static void main(String[] args) { 
     ArrayList<Number> numbers = new ArrayList<Number>(); 
     numbers.add(new Integer(5)); 
     TestMutableClassToInstanceMap test = new TestMutableClassToInstanceMap(numbers); 
    } 

    public TestMutableClassToInstanceMap(Collection<Number> numbers){ 
     for (Number number : numbers) { 
      this.identifiers.putInstance(number.getClass(), number); //error here 
     } 
     this.identifiers.putInstance(Double.class, 5.0); // This works 
    } 

} 

Répondre

4

Le but de la méthode putInstance, par opposition à la put régulière, est de fournir compilation sécurité de type. Dans ce cas, vous et moi pouvons facilement penser que number doit être du type donné par number.getClass(), mais pour le compilateur, cette information est "perdue". C'est, aussi loin que sait, peut-être number est un nombre entier et number.getClass() est Long.class; ce n'est pas assez "intelligent" pour comprendre que c'est sûr.

Solution: il suffit d'utiliser put()! Vous obtenez toujours les vérifications d'exécution, et vous pouvez toujours utiliser la méthode getInstance() typesafe par la suite, comme dans Long l = this.identifiers.getInstance(Long.class);.

(Dernier conseil: attention, parce que Long.class et long.class peuvent tous deux exister dans un ClassToInstanceMap et être mis en correspondance avec des valeurs différentes)

0

La réponse de Kevin est grande. En outre, vous pouvez dire de la définition de la méthode que le compilateur ne va pas permettre à l'appel:

  • putInstance exige (dans votre cas) un Class<Number>.
  • number.getClass() fournit une Class<? extends Number>

Ce qui n'est pas une sous-classe directe. Certains discours sur la variance et la covariance pourraient être utiles ici.

Questions connexes