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 <>

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top