Automatyczne boksowanie oznacza, że pierwsza wersja jest niejawnie konwertowana na drugą. Automatyczne rozpakowywanie oznacza, że możesz pisać:
int i = myMap.get("foo");
zamiast:
int i = myMap.get("foo").intValue();
Niejawne wywołanie intValue()oznacza, że jeśli klucz nie zostanie znaleziony, wygeneruje NullPointerException, na przykład:
int i = myMap.get("bar");// NullPointerException
Powodem jest wymazywanie typów . W przeciwieństwie do, powiedzmy, w C # typy ogólne nie są zachowywane w czasie wykonywania. Są po prostu „cukrem syntaktycznym” dla jawnego rzucania, aby zaoszczędzić ci tego:
Integer i =(Integer)myMap.get("foo");
Aby dać ci przykład, ten kod jest całkowicie legalny:
biorąc pod uwagę każdy oddzielny kod w nowej linii, kod w linii 5 musi być najpierw rzutowany na Integer przed użyciem metody intValue (), ponieważ jest on traktowany jako obiekt, gdy używasz metody get ().
int jest typem prymitywnym, możesz przeczytać, co oznacza typ prymitywny w java tutaj , a Map to interfejs, który ma obiekty jako dane wejściowe:
publicinterfaceMap<K extendsObject, V extendsObject>
obiekt oznacza klasę, a to oznacza również, że możesz stworzyć inną klasę, która się od niej wywodzi, ale nie możesz stworzyć klasy, która wykracza poza int. Nie możesz więc używać zmiennej int jako obiektu. Mam rozwiązania dla twojego problemu:
Map<String,Integer> map =newHashMap<>();
lub
Map<String,int[]> map =newHashMap<>();int x =1;//put x in mapint[] x_ =newint[]{x};
map.put("x", x_);//get the value of xint y = map.get("x")[0];
Odpowiedzi:
W Javie nie można używać typów pierwotnych jako argumentów ogólnych. Użyj zamiast tego:
W przypadku automatycznego pakowania / rozpakowywania istnieje niewielka różnica w kodzie. Auto-boxing oznacza, że możesz pisać:
zamiast:
Automatyczne boksowanie oznacza, że pierwsza wersja jest niejawnie konwertowana na drugą. Automatyczne rozpakowywanie oznacza, że możesz pisać:
zamiast:
Niejawne wywołanie
intValue()
oznacza, że jeśli klucz nie zostanie znaleziony, wygenerujeNullPointerException
, na przykład:Powodem jest wymazywanie typów . W przeciwieństwie do, powiedzmy, w C # typy ogólne nie są zachowywane w czasie wykonywania. Są po prostu „cukrem syntaktycznym” dla jawnego rzucania, aby zaoszczędzić ci tego:
Aby dać ci przykład, ten kod jest całkowicie legalny:
źródło
GNU Trove obsługuje to, ale nie używa typów ogólnych. http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html
źródło
W programie nie można używać typów pierwotnych
HashMap
.int
lubdouble
nie działa. Musisz użyć jego typu otaczającego. dla przykładuTeraz oba są obiektami, więc to zadziała.
źródło
int jest typem prymitywnym, możesz przeczytać, co oznacza typ prymitywny w java tutaj , a Map to interfejs, który ma obiekty jako dane wejściowe:
obiekt oznacza klasę, a to oznacza również, że możesz stworzyć inną klasę, która się od niej wywodzi, ale nie możesz stworzyć klasy, która wykracza poza int. Nie możesz więc używać zmiennej int jako obiektu. Mam rozwiązania dla twojego problemu:
lub
źródło
Możesz użyć typu referencyjnego w argumentach ogólnych, a nie typu pierwotnego. Więc tutaj powinieneś użyć
i zapisz wartość jako
źródło