Com o boxe automático / unboxing, há pouca diferença no código. O boxe automático significa que você pode escrever:
myMap.put("foo",3);
ao invés de:
myMap.put("foo",newInteger(3));
O boxe automático significa que a primeira versão é convertida implicitamente na segunda. Desembalar automaticamente significa que você pode escrever:
int i = myMap.get("foo");
ao invés de:
int i = myMap.get("foo").intValue();
A chamada implícita para intValue()significa que, se a chave não for encontrada, ela gerará um NullPointerException, por exemplo:
int i = myMap.get("bar");// NullPointerException
O motivo é o apagamento do tipo . Ao contrário, digamos, no C #, os tipos genéricos não são retidos no tempo de execução. Eles são apenas "açúcar sintático" para conversão explícita, para que você faça isso:
Integer i =(Integer)myMap.get("foo");
Para dar um exemplo, esse código é perfeitamente legal:
Seu último exemplo não funciona: não pode lançar a partir Map <String, Integer> para Map <Integer, String>
T3rm1
considerando cada código separado em uma nova linha, o código na linha 5 deve ser convertido primeiro em Inteiro antes de usar o método intValue () porque é considerado um objeto quando você usa o método get ().
int é um tipo primitivo, você pode ler o que significa um tipo primitivo em java aqui , e um Map é uma interface que possui objetos como entrada:
publicinterfaceMap<K extendsObject, V extendsObject>
O objeto significa uma classe e também significa que você pode criar uma outra classe que dela exista, mas não pode criar uma classe que exista de int. Portanto, você não pode usar a variável int como um objeto. Tenho duas soluções para o seu problema:
Map<String,Integer> map =newHashMap<>();
ou
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];
Respostas:
Você não pode usar tipos primitivos como argumentos genéricos em Java. Use em vez disso:
Com o boxe automático / unboxing, há pouca diferença no código. O boxe automático significa que você pode escrever:
ao invés de:
O boxe automático significa que a primeira versão é convertida implicitamente na segunda. Desembalar automaticamente significa que você pode escrever:
ao invés de:
A chamada implícita para
intValue()
significa que, se a chave não for encontrada, ela gerará umNullPointerException
, por exemplo:O motivo é o apagamento do tipo . Ao contrário, digamos, no C #, os tipos genéricos não são retidos no tempo de execução. Eles são apenas "açúcar sintático" para conversão explícita, para que você faça isso:
Para dar um exemplo, esse código é perfeitamente legal:
fonte
O GNU Trove suporta isso, mas não usa genéricos. http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html
fonte
Você não pode usar tipos primitivos em
HashMap
.int
oudouble
não funciona. Você precisa usar o tipo de anexo. Por exemploAgora, ambos são objetos, então isso funcionará.
fonte
int é um tipo primitivo, você pode ler o que significa um tipo primitivo em java aqui , e um Map é uma interface que possui objetos como entrada:
O objeto significa uma classe e também significa que você pode criar uma outra classe que dela exista, mas não pode criar uma classe que exista de int. Portanto, você não pode usar a variável int como um objeto. Tenho duas soluções para o seu problema:
ou
fonte
Você pode usar o tipo de referência em argumentos genéricos, não no tipo primitivo. Então aqui você deve usar
e armazene o valor como
fonte