web-dev-qa-db-fra.com

Utilisation de int comme paramètre de type pour Java.util.Dictionary

Lorsque j'essaie de déclarer un dictionnaire comme tel:

private Dictionary<String, int> map;

Le compilateur me donne l'erreur suivante:

Erreur de syntaxe sur le jeton "int", dimensions attendues après ce jeton

Mais cela fonctionne très bien avec Integer. Je suis vaguement conscient que Java traite int/Integer différemment (je viens d'un arrière-plan .NET), mais j'espérais que quelqu'un pourrait me donner un explication complète des raisons pour lesquelles je ne peux pas utiliser de primitives dans un dictionnaire <>

34
Richard Szalay

Dans Java ne sont pas des objets, vous ne pouvez donc pas les utiliser à la place des objets. Cependant Java va automatiquement encadrer/déballer les primitives (aka - Autoboxing ) en objets afin que vous puissiez faire des choses comme:

List<Integer> intList = new LinkedList<Integer>();
intList.add(1);
intList.add(new Integer(2));
...
Integer first = intList.get(0);
int second = intList.get(1);

Mais ce n'est vraiment que le compilateur qui convertit automatiquement les types pour vous.

40
Jeremy Raymond

Dans .Net, les types "primitifs" sont soutenus par des objets. En Java, il existe une distinction difficile entre les types primitifs et les objets. Java 5 a introduit l'autoboxing, qui peut contraindre les deux dans certaines situations. Cependant, comme le système générique Java utilise l'effacement de type, il n'y en a pas assez) informations à la boîte automatique dans ce cas.

9
JohnE

Les collections Java n'autorisent que les références et non les primitives. Vous devez utiliser les classes wrapper (dans ce cas Java.lang.Integer) pour faire ce que vous recherchez:

private Dictionary<String, Integer> map;

ils vous pouvez faire des choses comme:

int foo = map.get("hello");

et

map.put("world", 42);

et Java utilise l'autoboxing/unboxing pour gérer les détails de la conversion pour vous.

Ici en est une petite description.

5
TofuBeer
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)

C'est l'astuce spécifiez le type pour le faire fonctionner avec des primitives

Dans votre adaptateur

utiliser le même dans package-info signifie que vous le faites globalement pour ce package

Trouvé cela après avoir expérimenté.

public class MyAdapter extends XmlAdapter<String, Integer> {
1
Abs

Pour développer la réponse de TofuBeer.

int est une primitive

L'entier est un objet.

Les génériques ne prennent pas en charge les primitives.

1
Keibosh

Parce que dans Java les primitives sont vraiment des primitives. Dans Java int passera par valeur, tandis que Integer passera un Dans .NET int ou Int32 etc. ne sont que des noms différents.

0
Y. Shoham