2008-09-16 6 views
18

Dans le cadre des collections Java, l'interface Collection déclare la méthode suivante:Comment instancier un tableau Java en fonction d'un type de tableau lors de l'exécution?

<T> T[] toArray(T[] a)

Retourne un tableau contenant tous les éléments de cette collection; le type d'exécution du tableau retourné est celui du tableau spécifié. Si la collection entre dans le tableau spécifié, elle y est renvoyée. Sinon, un nouveau tableau est alloué avec le type d'exécution du tableau spécifié et la taille de cette collection.

Si vous voulez mettre en œuvre cette méthode, comment voulez-vous créer un tableau du type de un, connu seulement lors de l'exécution?

Répondre

3
Array.newInstance(Class componentType, int length) 
19

En regardant comment ArrayList le fait:

public <T> T[] toArray(T[] a) { 
    if (a.length < size) 
     a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); 
    System.arraycopy(elementData, 0, a, 0, size); 
    if (a.length > size) 
     a[size] = null; 
    return a; 
} 
-1

Pour créer un nouveau tableau d'un type générique (qui est seulement connu à l'exécution), vous devez créer un tableau d'objets et simplement le convertir en type générique et l'utiliser comme tel. C'est une limitation de l'implémentation générique de Java (effacement).

T[] newArray = (T[]) new Object[X]; // where X is the number of elements you want. 

La fonction prend alors le tableau donné (a) et l'utilise (vérifier sa taille au préalable) ou crée un nouveau.

+3

Contrairement à toutes les autres réponses ici, cette méthode ne crée * pas * un tableau de T. En raison de l'effacement, vous pouvez l'assigner à un T [], mais vous ne vous en tirerez pas toujours. Si dans une instance spécifique, T est String, et que le tableau que vous avez créé est (retourné à une autre méthode et) assigné à String [] (qui n'aura pas besoin d'un cast), vous obtiendrez une ClassCastException inattendue. Ceci est un exemple de pollution de type. Ne fais pas ça! –

Questions connexes