2010-01-04 18 views
34

Cuando trato de declarar un diccionario como tal:int como un parámetro de tipo para java.util.Dictionary

private Dictionary<String, int> map; 

El compilador me da el siguiente error:

Syntax error on token "int", Dimensions expected after this token

pero funciona bien con Integer. Estoy vagamente consciente de que Java trata a int/Integer diferente (Vengo de un fondo .NET), pero yo estaba esperando que alguien me pudiera dar una explicación completa de por qué no puedo usar primitivas en un diccionario <>

+5

De diccionario javadoc: ** NOTA: ** Esta clase es obsoleta. Las nuevas implementaciones deberían implementar la interfaz Map, en lugar de extender esta clase. – Esko

+1

Ponlo como respuesta y lo +1 (nuevamente) –

+1

Meh, realmente no me importa - lo haces, te llamaré +1 :) – Esko

Respuesta

40

En Java, las primitivas no son objetos, por lo que no puede usarlas en lugar de objetos. Sin embargo Java caja automática/primitivas Unbox (aka autoboxing) en los objetos para que pueda hacer cosas 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); 

Pero esto es sólo el compilador la conversión automática de tipos para usted.

+0

Hmm, Java es menos eficiente que .NET porque te obliga a insertar el entero antes de agregarlo a la ¿colección? Ese es uno de los beneficios a menudo indicados del 'Diccionario ' sobre 'HashTable' en .NET - usted evita el boxeo. –

+0

¿Qué se entiende por "Dimensiones esperadas después de este token"? ¿Se está refiriendo a una matriz, como 'int []' que estaría bien porque es un objeto 'Array'? – ADTC

4

Las colecciones de Java solo permiten referencias no primitivas. Es necesario utilizar las clases de contenedor (en este caso java.lang.Integer) para hacer lo que está buscando:

private Dictionary<String, Integer> map; 

que le puede hacer cosas como:

int foo = map.get("hello"); 

y

map.put("world", 42); 

y Java usa autoboxing/unboxing para tratar los detalles de la conversión por usted.

Here es una pequeña descripción sobre él.

+0

Mencioné que funciona 'Entero 'en mi publicación original. Esperaba una explicación sobre por qué –

+0

Gracias por la edición, he eliminado el -1 :) –

+0

¿No es int [] no es un primitivo? Puede que solo esté esperando una matriz, ¿verdad? –

0

Porque en Java las primitivas son verdaderamente primitivas. En Java int pasará por el valor, mientras que Integer pasará una referencia. En .NET int o Int32 etc. son solo nombres diferentes.

+0

Excepto que los medicamentos genéricos son parte del proceso de compilación; nunca se "pasa" nada en el ejemplo del póster. – JohnE

+0

FYI, int/Int32 pasará por referencia en .NET también ya que son tipos de valor (y por lo tanto viven en la pila). –

+0

Además, 'int' es solo un alias para' Int32' en C#. VB.NET usa 'Integer' –

9

En .Net, los tipos "primitivos" están respaldados por objetos. En Java, hay una distinción difícil entre tipos primitivos y Objetos. Java 5 introdujo el autoboxing, que puede forzar entre los dos en ciertas situaciones. Sin embargo, debido a que el sistema genérico de Java utiliza borrado de tipo, no hay suficiente información para autobox en este caso.

1

Para ampliar la respuesta de TofuBeer.

int es una primitiva

entero es un objeto.

Los genéricos no son compatibles con las primitivas.

+1

Diría que es más un resumen que una expansión :) –

+1

Editó su publicación desde la mía :) – Keibosh

1
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class) 

Eso es el truco especifique el tipo de hacer que funcione a partir de primitivas

En su adaptador

utilizando el mismo en el paquete-info significará lo haces a nivel mundial para ese paquete

Encontrado esto después de experimentar

public class MyAdapter extends XmlAdapter<String, Integer> { 
Cuestiones relacionadas