Hashmap ne fonctionne pas avec int, char

Duplication possible:
Stocker des valeurs primitives dans une collection Java?

En java lorsque j’utilise les éléments suivants: –

public HashMap buildMap(Ssortingng letters) { HashMap checkSum = new HashMap(); for ( int i = 0; i < letters.length(); ++i ) { checkSum.put(letters.charAt(i), primes[i]); } return checkSum; } 

Je reçois des erreurs liées à des types inappropriés. J’ai résolu mon problème en utilisant respectivement Character et Integer au lieu de char et int respectivement. Cependant, j’ai du mal à comprendre pourquoi HashMap ne parvient pas à gérer les types de données primitifs.

Les parameters génériques ne peuvent être liés qu’à des types de référence et non à des types primitifs. Vous devez donc utiliser les types de wrappers correspondants. Essayez HashMap place.

Cependant, j’ai du mal à comprendre pourquoi HashMap ne parvient pas à gérer les types de données primitifs.

Ceci est dû au type d’effacement . Java n’avait pas de génériques depuis le début, donc un HashMap est vraiment un HashMap . Le compilateur effectue un grand nombre de vérifications et d’implémentations implicites pour s’assurer que vous ne mettez pas le mauvais type de valeur ou que vous ne tapez pas le bon type, mais à l’exécution, il n’existe qu’une seule classe HashMap et stocke les objects.

D’autres langages “spécialisent” les types donc en C ++, un vector est très différent d’un vector interne et ils ne partagent aucun vector commun vector Super-type. Java définit cependant les choses afin qu’une List soit une List indépendamment de ce que T est pour la compatibilité ascendante avec le code pré-générique. Cette exigence de compatibilité ascendante selon laquelle il doit exister une classe d’implémentation unique pour toutes les paramésortingsations de type générique empêche le type de spécialisation de modèle qui permettrait aux parameters génériques de se lier aux primitives.

Les génériques ne peuvent pas utiliser les types primitifs sous la forme de mots-clés.

Utilisation

 public HashMap buildMap(Ssortingng letters) { HashMap checkSum = new HashMap(); for ( int i = 0; i < letters.length(); ++i ) { checkSum.put(letters.charAt(i), primes[i]); } return checkSum; } 

Les génériques ne prennent en charge que les types d’object, pas les primitives. Contrairement aux modèles C ++, les génériques n’impliquent pas la génération de code et il n’existe qu’un seul code HashMap, quel que soit le nombre de types génériques que vous utilisez.

Trove4J contourne ce problème en pré-générant les collections sélectionnées pour utiliser des primitives et prend en charge TCharIntHashMap qui peut envelopper si nécessaire la Map .

TCharIntHashMap: une implémentation de carte ouverte adressée pour les clés de caractères et les valeurs int.

Hashmaps ne peut utiliser que des classes , pas des primitives . Cette page de programmerinterview.com pourrait vous aider à trouver la réponse. Pour être honnête, je n’ai pas trouvé la réponse à ce problème en détail moi-même.

Vous ne pouvez pas mettre des types primitifs dans des collections. Cependant, vous pouvez les déclarer en utilisant leurs wrappers d’object correspondants et toujours append les valeurs primitives, à condition que la boxe vous le permette.

Les classes de collecte génériques ne peuvent pas être utilisées avec des primitives. Utilisez plutôt les classes d’encapsulation Character et Integer.

Map checkSum = new HashMap();

Generics peuvent être définis à l’aide de classes Wrapper uniquement. Si vous ne voulez pas définir l’utilisation de types Wrapper, vous pouvez utiliser la définition Raw comme ci-dessous

 @SuppressWarnings("rawtypes") public HashMap buildMap(Ssortingng letters) { HashMap checkSum = new HashMap(); for ( int i = 0; i < letters.length(); ++i ) { checkSum.put(letters.charAt(i), primes[i]); } return checkSum; } 

Ou définissez HashMap à l'aide de types d'encapsuleur et stockez les types primitifs. Les valeurs primitives seront promues dans leurs types d'encapsuleur.

 public HashMap buildMap(Ssortingng letters) { HashMap checkSum = new HashMap(); for ( int i = 0; i < letters.length(); ++i ) { checkSum.put(letters.charAt(i), primes[i]); } return checkSum; }