2010-11-03 5 views
4

Le code ci-dessous compile sans erreur ... pour une fois que j'aurais préféré à l'échec:/Java Generics non-question au moment de la compilation

Map <Character, Double> m = new HashMap <Character, Double>(); 
    m.get(new String()); 

Depuis le compilateur sait que la clé utilisée dans cette carte est de type Caractère, en utilisant une clé de chaîne à la place devrait être marqué comme incorrect.

Qu'est-ce qui me manque?

Répondre

11

Vous ne manquez rien. Tous les appels Map#get() prennent simplement Object.

En fonction de la mise en œuvre, vous pouvez voir un (runtime) ClassCastException lorsque vous passez un String à un Map<Character, Double>#get().


Here's why Map#get() isn't fully generic.

+0

Oui, c'est correct. String est un objet :) Mon IDE lance un avertissement si –

+1

Je pense que le but de ceci est de sauvegarder le code existant. Corrigez-moi si je me trompe. – Jeremy

+0

exactement à droite (+1), affreux bien que ce soit ... –

1

Une exception d'exécution (facultative) (ClassCastException) vous manque si vous essayez d'exécuter ce code.

1

Que la méthode get ne soit pas paramétrée avec un paramètre générique seul le résultat est.

Vous pouvez également faire

m.get(1L); //m.get(Object o); 

La méthode est mise paramétrisé

m.put(new String(), 0.0); //Fail 

//The method put(Character, Double) in the type Map<Character,Double> is not applicable for the arguments (String, double) 

m.put(new Character('c'), 0.0); //Ok 
0

get récupère un objet que la l'argument est .equals() à. Il est possible qu'un objet soit .equals() pour un objet d'une autre classe.

Questions connexes