Usando int como parâmetro tipo para java.util.Dictionary
-
18-09-2019 - |
Pergunta
Quando tento declarar um dicionário como tal:
private Dictionary<String, int> map;
O compilador me dá o seguinte erro:
Erro de sintaxe em "int" forma, dimensões esperado após este token
Mas ele funciona bem com Integer
. Estou vagamente consciente de que Java trata int
/ Integer
diferente (Eu venho de um fundo .NET), mas eu estava esperando que alguém poderia me dar uma explicação completa sobre o porquê eu não posso usar primitivas em um Dictionary <>
Solução
primitivos em Java não são objetos, então você não pode usá-los no lugar de objetos. No entanto Java irá caixa automática / primitivas Unbox (aka autoboxing ) em objetos para que você pode fazer coisas como:
List<Integer> intList = new LinkedList<Integer>();
intList.add(1);
intList.add(new Integer(2));
...
Integer first = intList.get(0);
int second = intList.get(1);
Mas isso é realmente apenas o compilador converter automaticamente tipos para você.
Outras dicas
Na Net, tipos "primitivas" são apoiados por objetos. Em Java, há uma distinção clara entre tipos primitivos e objetos. Java 5 introduziu autoboxing, que pode coagir entre os dois em determinadas situações. No entanto, porque o sistema do Java genéricos usa tipo-apagamento, não há informações suficientes para autobox neste caso.
coleções Java só permitem referências não primitivos. Você precisa usar as classes de mensagens (neste caso java.lang.Integer) para fazer o que você está depois:
private Dictionary<String, Integer> map;
que você pode fazer coisas como:
int foo = map.get("hello");
e
map.put("world", 42);
e Java usa autoboxing / unboxing para lidar com os detalhes da conversão para você.
Aqui é uma pequena descrição sobre ele.
Para expandir a resposta de TofuBeer.
int é um primitivo
Integer é um objeto.
Os genéricos não suporta primitivas.
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)
Isso é o truque especificar o tipo de fazê-lo funcionar com primitivos
Em seu adaptador
usando o mesmo no pacote-info irá significar que você fazê-lo globalmente para que o pacote
Encontrei este depois de experimentar.
public class MyAdapter extends XmlAdapter<String, Integer> {
Porque em Java os primitivos são primitivos Verdadeiramente. Em Java int
vai passar por valor, enquanto Integer
vai passar uma referência. Em .NET int ou Int32 etc, são apenas nomes diferentes.