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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top