Utilizzando int come parametro tipo per java.util.Dictionary
-
18-09-2019 - |
Domanda
Quando provo a dichiarare un dizionario come ad esempio:
private Dictionary<String, int> map;
Il compilatore mi dà il seguente errore:
Errore di sintassi sul gettone "int", Dimensioni attesi dopo questo token
Ma funziona bene con Integer
. Sono vagamente consapevole che Java tratta int
/ Integer
modo diverso (io vengo da un background NET), ma speravo che qualcuno mi potrebbe dare una spiegazione completa sul perché non posso usare le primitive in un dizionario <>
Soluzione
In primitive Java non sono oggetti, in modo che non si possono utilizzare al posto degli oggetti. Tuttavia Java sarà box automaticamente / primitive Unbox (aka autoboxing ) in oggetti in modo da poter fare le cose come:
List<Integer> intList = new LinkedList<Integer>();
intList.add(1);
intList.add(new Integer(2));
...
Integer first = intList.get(0);
int second = intList.get(1);
Ma questo è in realtà solo il compilatore converte automaticamente i tipi per voi.
Altri suggerimenti
In .Net, tipi "primitivi" sono supportati da oggetti. In Java, c'è una distinzione duro tra tipi primitivi e oggetti. Java 5 ha introdotto autoboxing, che può costringere tra i due in determinate situazioni. Tuttavia, poiché il sistema di generici Java utilizza tipo-cancellazione, non c'è abbastanza informazioni per autobox in questo caso.
collezioni di Java consentono solo non riferimenti primitive. È necessario utilizzare le classi wrapper (in questo caso java.lang.Integer) di fare quello che stai cercando:
private Dictionary<String, Integer> map;
che si possono fare cose come:
int foo = map.get("hello");
e
map.put("world", 42);
e Java utilizza autoboxing / unboxing a che fare con i dettagli della conversione per voi.
Qui è una breve descrizione su di esso.
Per espandere sulla risposta di TofuBeer.
int è un primitivo
Integer è un oggetto.
I generici non supporta primitive.
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)
Questo è il trucco tipo specificare di farlo funzionare con primitive
Nella scheda
utilizzando lo stesso in package-info significherà lo si fa a livello mondiale per quel pacchetto
Ho trovato questo dopo aver sperimentato.
public class MyAdapter extends XmlAdapter<String, Integer> {
Perché in Java le primitive sono primitive veramente. In Java int
passerà valore, mentre Integer
passa un riferimento. In int .NET o Int32 ecc, sono solo nomi diversi.