java: HashMap <String, int> não está funcionando

128

HashMap<String, int>parece não funcionar, mas HashMap<String, Integer>funciona. Alguma idéia do porquê?

gklots
fonte
sua escolha de palavras para sua pergunta é confusa, você pode esclarecer? E exatamente o que não está funcionando, você pode publicar o código?
Anthony Forloney 22/11/2009

Respostas:

203

Você não pode usar tipos primitivos como argumentos genéricos em Java. Use em vez disso:

Map<String, Integer> myMap = new HashMap<String, Integer>();

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", new Integer(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:

Map<String, Integer> myMap = new HashMap<String, Integer>();
Map<Integer, String> map2 = (Map<Integer, String>)myMap;
map2.put(3, "foo");
cleto
fonte
3
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 ().
aluno fresca
2

Você não pode usar tipos primitivos em HashMap. intou doublenão funciona. Você precisa usar o tipo de anexo. Por exemplo

Map<String,Integer> m = new HashMap<String,Integer>();

Agora, ambos são objetos, então isso funcionará.


fonte
0

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:

public interface Map<K extends Object, V extends Object>

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 = new HashMap<>();

ou

Map<String, int[]> map = new HashMap<>();
int x = 1;

//put x in map
int[] x_ = new int[]{x};
map.put("x", x_);

//get the value of x
int y = map.get("x")[0];
Younes Meridji
fonte
-3

Você pode usar o tipo de referência em argumentos genéricos, não no tipo primitivo. Então aqui você deve usar

Map<String, Integer> myMap = new HashMap<String, Integer>();

e armazene o valor como

myMap.put("abc", 5);
Chitrapal Singh
fonte
1
Isso não responder à pergunta
smac89