2013-08-15 13 views
8

Ho il seguente codice in cui sto creando un array e sto provando a memorizzare oggetti in esso. In fase di esecuzione, ottengo un ArrayStoreException.Perché questa generazione di generici non funziona come previsto?

import java.lang.reflect.Array; 

public class GenericsArrayCreation<T> { 

    public static <T> void Test(T[] A){ 
     @SuppressWarnings("unchecked") 
     T[] temp = (T[]) Array.newInstance(A.getClass(), A.length); 
     for(int i = 0;i<temp.length;i++){ 
      temp[i] = A[i]; 
      System.out.println(temp[i].toString()); 
     } 
    } 

    public static void main(String[] args){ 
     String[] strs = {"a", "b", "c"}; 
     GenericsArrayCreation.Test(strs); 
    } 
} 

qualche modo capito che questo è a causa della dichiarazione

T[] temp = (T[]) Array.newInstance(A.getClass(), A.length); 

Perché è questo che non va? A.getClass() al runtime restituisce un String, quindi temp deve essere un array di stringhe. In tal caso, perché l'assegnazione temp[i] = A[i] non funziona?

+0

Hai confermato (con un debugger o un'istruzione 'print') che' A.getClass() 'è' String'? – chrylis

risposta

6

Il tipo di A è java.lang.String[], anziché java.lang.String.

Si desidera il tipo di componente dell'array, piuttosto che il tipo di matrice stesso.

Utilizzare questa linea invece:

T[] temp = (T[]) Array.newInstance(A.getClass().getComponentType(), A.length); 

e il codice funziona benissimo.

+0

Grazie! quello lo ha riparato! –

0

Provare a stampare temp.getClass() - è una matrice di matrici, T[][]. Avrai voglia di Class.getComponentType.

+0

No. Il documento dice: Se componentType rappresenta una classe array, il numero di dimensioni del nuovo array è uguale alla somma di dimensions.length e il numero di dimensioni di componentType. In questo caso, il tipo di componente del nuovo array è il tipo di componente di componentType. – nes1983

+0

@ nes1983 Cosa? * "Restituisce la classe che rappresenta il tipo di componente di un array.Se questa classe non rappresenta una classe array questo metodo restituisce null." * –

+0

Onestamente, penso che questa API faccia schifo. – nes1983

0

tuoi A.getClass() restituisce una matrice String e non String, ecco perché si stanno ottenendo ArrayStoreException.

Problemi correlati