Utilisation d'int comme paramètre de type pour java.util.Dictionary
-
18-09-2019 - |
Question
Lorsque je tente de déclarer un dictionnaire en tant que tel:
private Dictionary<String, int> map;
Le compilateur me donne l'erreur suivante:
Erreur de syntaxe sur "int" jeton, les dimensions attendues après ce jeton
Mais il fonctionne très bien avec Integer
. Je suis vaguement conscient que Java traite int
/ Integer
différemment (je viens d'un milieu .NET), mais j'espérais que quelqu'un pourrait me donner une explication complète sur les raisons que je ne peux pas utiliser les primitives dans un dictionnaire <>
La solution
Dans primitives Java ne sont pas des objets, de sorte que vous ne pouvez pas les utiliser à la place des objets. Cependant Java / boîte automatiquement primitives Unbox (alias 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 qui est vraiment juste le compilateur convertissant automatiquement les types pour vous.
Autres conseils
Dans .Net, les types "primitifs" sont soutenus par des objets. En Java, il y a une distinction entre les types primitifs dur et objets. Java 5 introduit autoboxing, qui peut contraindre entre les deux dans certaines situations. Cependant, parce que le système Java génériques utilise le type d'effacement, il n'y a pas suffisamment d'informations pour autobox dans ce cas.
collections Java ne permettent que des références non primitives. Vous devez utiliser les classes d'emballage (dans ce cas java.lang.Integer) de 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 autoboxing / unboxing pour traiter les détails de la conversion pour vous.
Pour développer la réponse de TofuBeer.
int est une primitive
Entier est un objet.
Generics ne supporte pas les primitives.
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)
Cest l'astuce spécifier le type pour le faire fonctionner avec des primitives
Dans votre adaptateur
en utilisant le même dans le paquet-info signifie que vous le faites dans le monde pour ce paquet
trouvé cela après l'expérimentation.
public class MyAdapter extends XmlAdapter<String, Integer> {
Parce que Java, les primitives sont primitives Truely. En Java int
passera par la valeur, tandis que Integer
passera une référence. Dans .NET ou int Int32 etc sont juste des noms différents.