2011-12-15 23 views
5

Estaba trabajando en un problema cuando me encontré con esto.¿Por qué funciona char para int casting y no char para Integer en Java

(int)input.charAt(i) //works 
(Integer)input.charAt(i) // Does not work 
// input being a string 

La primera idea que tengo es que los primitivos se tratan de manera diferente y es por eso que esto no funciona. Pero luego me resulta difícil entender por qué tendrían una clase de Contenedor de Entero en primer lugar.

Edit: ¿Cuáles son las ventajas de tener clases contenedoras entonces? ¿Es solo por no tener una presencia primitiva y ser más OO en el diseño? Me resulta difícil entender cómo son útiles. Nueva duda altogetehr.

+2

Interesante.Hubiera pensado que podría ser en caja automática. – DerMike

Respuesta

7

Tiene razón en que las primitivas son tratadas de manera diferente. El siguiente funcionaría:

(Integer)(int)input.charAt(i); 

La diferencia es que cuando el argumento es un int, (Integer)cajas el entero. En realidad, no es un yeso aunque parezca así. Pero si el argumento es un char, entonces sería un intento de lanzamiento; pero las primitivas no se pueden convertir en objetos y, por lo tanto, no funcionan. Lo que puede hacer es primero emitir el char a int - este molde está bien ya que ambos son tipos primitivos - y luego el int se puede encasillar.

Por supuesto, char ->Integer boxeo podría se han hecho trabajar. "¿Por qué no?" es una buena pregunta Probablemente se habría utilizado poco para dicha característica, especialmente cuando la misma función se puede lograr siendo un poco más explícita. (debe char ->Long trabajo demasiado, entonces y char ->Short caracteres son de 16 bits, por lo que este sería el más sencillo??.)

respuesta a editar: la ventaja de clases de envoltura es primitivas que envueltos se pueden tratar como objetos: almacenados en un List<Integer>, por ejemplo. List<int> no funcionaría, porque int no es un objeto. Entonces, quizás una pregunta aún más relevante sería, ¿qué hacen los no objetos primitivos en un lenguaje OO? La respuesta está en el rendimiento: las primitivas son más rápidas y toman menos memoria. El caso de uso determina si la conveniencia de los objetos o el rendimiento de los primitivos es más importante.

+0

¿Entonces no usar primitivas en colecciones acelerará el rendimiento? – gizgok

+0

@gizgok: no hay forma de usar primitivas en colecciones porque las primitivas no son objetos. Es decir, no puede construir una 'Lista ', no se compila. * Las matrices * primitivas son, sin embargo, objetos, por lo que una 'Lista ' funcionaría, y sí, dependiendo de lo que haga con ella y cómo, sería al menos tan o más eficiente como 'Lista '. –

2

Porque Integer es un Object. y char no es. no puedes lanzar una cosa que no sea Objeto a algún Objeto.

De hecho, no puede convertir ningún Objeto en ninguna otra clase Objeto que no esté en la jerarquía de ese Objeto.

por ejemplo, no se puede hacer esto

Integer g = (Integer) s; 

donde s es objeto de String.

Ahora, por qué chat to int funciona, porque cada carácter se representa como unicode en java, por lo que se puede pensar en que backend char es una versión más pequeña de int. (int es 32 bits y char es 16 bits)

+0

Es cierto, pero pensé que el auto boxeo habría sucedido. – gizgok

+0

auto boxing es cierto solo para ints. esto significa que no tendrá que realizar un lanzamiento explícito cuando esté convirtiendo un int en Integer. @gizgok – Zohaib