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 <>
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.
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.
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.
@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> {
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.
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.