java classcastexception

java - illegalargumentexception



ClassCastException, conversión Integer al doble (9)

ArrayList marks = new ArrayList(); Double sum = 0.0; sum = ((Double)marks.get(i));

Cada vez que intento ejecutar mi programa, obtengo una ClassCastException que dice: java.lang.Integer no se puede convertir a java.lang.Double


2 cosas para entender aquí -

1) Si está lanzando Primger interger a Primitive double . Funciona. por ejemplo , funciona bien.

int pri=12; System.out.println((double)pri);

2) si intentas Integer objeto Integer objeto Double o viceversa, falla.

Integer a = 1; Double b = (double) a; // WRONG. Fails with class cast excptn

Solución -

Soln 1) Integer i = 1; Double b = new Double(i); soln 2) Double d = 2.0; Integer x = d.intValue();


Bueno, el código que ha mostrado en realidad no incluye agregar ningún número entero a ArrayList , pero si sabe que tiene números enteros, puede usar:

sum = (double) ((Integer) marks.get(i)).intValue();

Eso lo convertirá en un int , que luego puede convertirse en double . No puedes simplemente lanzar directamente entre las clases en caja.

Tenga en cuenta que si puede usar genéricos para su ArrayList , su código será más claro.


Cambiar un entero a un doble

int abc=12; //setting up integer "abc" System.out.println((double)abc);

El código dará como resultado entero "abc" como un doble, lo que significa que se mostrará como "12.0". Observe cómo hay un lugar decimal, lo que indica que este dígito de precisión se ha almacenado.

Lo mismo con el doble si quieres volver a cambiarlo,

double number=13.94; System.out.println((int)number);

Este código se imprimirá en una línea, "número" como un número entero. La salida será "13". Observe que el valor no se ha redondeado, los datos se han omitido realmente.


Creo que el principal problema es que estás lanzando el uso de la clase contenedora, parece que son tipos incompatibles.

Pero otro problema es que "yo" es un int, por lo que estás emitiendo el resultado final y tú también deberías lanzarlo yo. También intente utilizar la palabra clave "doble" para lanzar y no la clase contenedora "Doble".

Puede consultar aquí:

Espero que esto ayude. Encontré el hilo útil, pero creo que esto ayuda a aclararlo aún más.


El código publicado en la pregunta obviamente no es un completo ejemplo (no está agregando nada a la lista de arrays, no lo estoy definiendo en ninguna parte).

Primero, como otros han dicho, necesita comprender la diferencia entre los tipos primitivos y los tipos de clase que los recubren. Por ejemplo, cuadros Integer int , Double cajas double , Long cuadros long y así sucesivamente. Java encapsula y desempaqueta automáticamente en varios escenarios (solía ser que tenía que marcar y deshacer la casilla manualmente con las llamadas a la biblioteca, pero eso se consideraba un PITA feo).

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

En su mayoría se puede convertir de un tipo primitivo a otro (la excepción es boolean ) pero no se puede hacer lo mismo para los tipos encuadrados. Convertir un tipo en caja a otro es un poco más complejo. Especialmente si no conoce el tipo de caja por adelantado. Por lo general, implicará la conversión a través de uno o más tipos primitivos.

Entonces, la respuesta a su pregunta depende de lo que hay en su lista de arrays, si solo se trata de objetos de tipo entero que puede hacer.

sum = ((double)(int)marks.get(i));

El elenco de int estará detrás de las escenas y marks.get el resultado de marks.get a Integer , luego destrabará ese entero. Luego usamos otro elenco para convertir la primitiva int a una primitiva double . Finalmente, el resultado se autoboxeará nuevamente en un Double cuando esté asignado a la variable de suma. (Por supuesto, probablemente tendría más sentido que la suma sea de tipo double lugar de Double en la mayoría de los casos).

Si su arraylist contiene una mezcla de tipos pero todos implementan la interfaz Number (Integer, Short, Long, Float y Double all do pero Character y Boolean no) entonces usted puede hacerlo.

sum = ((Number)marks.get(i)).doubleValue();

Si también hay otros tipos en la mezcla, es posible que deba considerar usar el operador instanceof para identificarlos y tomar las medidas adecuadas.


Esto significa que su ArrayList tiene números enteros en algunos elementos. El casting debería funcionar a menos que haya un entero en uno de tus elementos.

Una forma de asegurarse de que su arraylist no tenga números enteros es declarándolo como una matriz de Dobles.

ArrayList<Double> marks = new ArrayList<Double>();


Podemos convertir un int en un double pero no podemos hacer lo mismo con las clases contenedoras Integer y Double :

int a = 1; Integer b = 1; // inboxing, requires Java 1.5+ double c = (double) a; // OK Double d = (Double) b; // No way.

Esto muestra el error de tiempo de compilación que corresponde a su excepción de tiempo de ejecución.


especifica tus marcas:

List<Double> marks = new ArrayList<Double>();

Esto se llama genéricos.


sum = Double.parseDouble(""+marks.get(i));