java - guardar - que es un array en programacion
lanzando una matriz de objetos a un error de matriz Integer (5)
No puede convertir una matriz de Object
en una matriz de Integer
. Tienes que recorrer todos los elementos de a y lanzar cada uno individualmente.
Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = new Integer[a.length];
for(int i = 0; i < a.length; i++)
{
c[i] = (Integer) a[i];
}
Editar: creo que la razón detrás de esta restricción es que, al realizar un casting, la JVM quiere garantizar la seguridad de tipo en el tiempo de ejecución. Como una matriz de Objects
puede ser cualquier cosa además de los Integers
, la JVM tendría que hacer lo que el código anterior está haciendo de todos modos (observe cada elemento individualmente). Los diseñadores de idiomas decidieron que no querían que la JVM hiciera eso (no estoy seguro de por qué, pero estoy seguro de que es una buena razón).
Sin embargo, puede convertir una matriz de subtipos en una matriz de supertipos (por ejemplo, Integer[]
a Object[]
)!
¿Qué pasa con el siguiente código?
Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;
El código tiene el siguiente error en la última línea:
Excepción en el hilo "main" java.lang.ClassCastException: [Ljava.lang.Object; no se puede convertir a [Ljava.lang.Integer;
O haz lo siguiente:
...
Integer[] integerArray = new Integer[integerList.size()];
integerList.toArray(integerArray);
return integerArray;
}
Ross, también puedes usar Arrays.copyof () o Arrays.copyOfRange ().
Integer[] integerArray = Arrays.copyOf(a, a.length, Integer[].class);
Integer[] integerArray = Arrays.copyOfRange(a, 0, a.length, Integer[].class);
Aquí la razón para golpear una ClassCastException
es que no puede tratar una matriz de Integer
como una matriz de Object
. Integer[]
es un subtipo de Object[]
pero Object[]
no es un Integer[]
.
Y lo siguiente tampoco dará una ClassCastException
.
Object[] a = new Integer[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
intentas lanzar un Array of Object para convertirlo en Array of Integer. No puedes hacerlo Este tipo de downcast no está permitido.
Puede hacer una matriz de Entero, y luego copiar cada valor de la primera matriz en una segunda matriz.
Cuando se trata de la fundición de tipos de objeto, la
instanceof
prueba debe pasar para que la tarea se ejecute. En tu ejemplo, resulta Object[] a = new Object[1]; boolean isIntegerArr = a instanceof Integer[]
Si haces un
sysout
de la línea anterior, devolvería falso; Así que probar una instancia de verificación antes de lanzar ayudaría. Entonces, para corregir el error, puede agregar el cheque de ''instancia''
O
use la siguiente línea de código:
(Arrays.asList(a)).toArray(c);
Tenga en cuenta que el código anterior fallaría si la matriz de Objetos contiene alguna entrada que no sea Integer.