fusione di matrice di oggetti in errore di array intero

Cosa c’è che non va nel seguente codice?

Object[] a = new Object[1]; Integer b=1; a[0]=b; Integer[] c = (Integer[]) a; 

Il codice ha il seguente errore nell’ultima riga:

Eccezione nella discussione “main” java.lang.ClassCastException: [Ljava.lang.Object; non può essere lanciato su [Ljava.lang.Integer;

Ross, puoi usare anche Arrays.copyof () o Arrays.copyOfRange ().

 Integer[] integerArray = Arrays.copyOf(a, a.length, Integer[].class); Integer[] integerArray = Arrays.copyOfRange(a, 0, a.length, Integer[].class); 

Qui il motivo per colpire un ClassCastException è che non puoi trattare un array di Integer come una matrice di Object . Integer[] è un sottotipo di Object[] ma Object[] non è un Integer[] .

E anche i seguenti non daranno una ClassCastException .

 Object[] a = new Integer[1]; Integer b=1; a[0]=b; Integer[] c = (Integer[]) a; 

Non è ansible eseguire il cast di una matrice Object su un array Integer . Devi scorrere tutti gli elementi di a e lanciarli singolarmente.

 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]; } 

Edit: Credo che la logica dietro questa restrizione è che durante la trasmissione, la JVM vuole garantire la sicurezza del tipo in fase di esecuzione. Poiché una serie di Objects può essere qualsiasi cosa Integers , la JVM dovrebbe fare ciò che sta facendo il codice sopra (guarda ogni elemento singolarmente). I progettisti di linguaggi hanno deciso che non volevano che la JVM lo facesse (non sono sicuro del perché, ma sono sicuro che sia una buona ragione).

Tuttavia, puoi lanciare una matrice di sottotipi in una matrice di supertipo (ad esempio Integer[] in Object[] )!

O fai quanto segue:

 ... Integer[] integerArray = new Integer[integerList.size()]; integerList.toArray(integerArray); return integerArray; } 
 java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer; 

provate a lanciare una Matrice di Oggetto da lanciare in Matrice di Intero. Non puoi farlo. Questo tipo di downcast non è permesso.

È ansible creare una matrice di Integer e, successivamente, copiare ogni valore della prima matrice in un secondo array.

Quando il cast viene eseguito in Java, il compilatore Java e il run-time Java verificano se il casting è ansible o meno e genera errori nel caso non lo faccia.

Quando si esegue il casting di tipi di object, l’ instanceof test deve passare in modo che l’assegnazione venga eseguita. Nel tuo esempio risulta
Object[] a = new Object[1]; boolean isIntegerArr = a instanceof Integer[]
Se fai un sysout della riga sopra, restituirebbe falso;
Quindi provare un’istanza di controllo prima di trasmettere sarebbe d’aiuto. Quindi, per correggere l’errore, puoi aggiungere il controllo ‘instanceof’
O
usa la seguente riga di codice:
(Arrays.asList(a)).toArray(c);

Si prega di notare che il codice sopra sarebbe fallito, se l’array Object contiene una voce diversa da Integer.