2010-10-25 16 views
4
public K[] toArray() 
{ 
    K[] result = (K[])new Object[this.size()]; 
    int index = 0; 
    for(K k : this) 
     result[index++] = k; 
    return result; 
} 

Ce code ne semble pas fonctionner, il rejettera une exception:Création de tableaux génériques en Java

java.lang.ClassCastException: [Ljava.lang.Object; ne peut pas être converti en ...

Quelqu'un pourrait-il me dire comment créer un tableau avec un type générique? Merci.

+0

Copie possible de http://stackoverflow.com/questions/395030/quick-java-question-casting-an-array-of-objects-into-an-array-of-my-intended-cla –

+0

au moins trois doublons de cela. Rechercher avant de poster – Bozho

+0

nième question identique à beaucoup d'autres :) – Jack

Répondre

11

Vous ne pouvez pas: vous devez passer la classe comme argument:

public <K> K[] toArray(Class<K> clazz) 
{ 
    K[] result = (K[])Array.newInstance(clazz,this.size()); 
    int index = 0; 
    for(K k : this) 
     result[index++] = k; 
    return result; 
} 
0

Ok, cela ne fonctionne pas K [] result = new K [this.size()];

Si vous pouviez détenir une classe. Puis:

Class claz; 
    Test(Class m) { 
    claz = m; 
    } 

    <K> K[] toArray() { 
K[] array=(K[])Array.newInstance(claz,this.size()); 
return array; 
} 
+0

Vous ne pouvez pas créer de tableaux génériques directement. C'est pourquoi je demande ... – ExtremeCoder

1

Votre code génère cette exception parce qu'il est en fait, vous donnant un tableau de type Object. Le code de Maurice Perry fonctionne, mais la distribution à K[ ] entraînera un avertissement, car le compilateur ne peut pas garantir la sécurité du type dans ce cas en raison de l'effacement du type. Vous pouvez cependant faire ce qui suit.

import java.util.ArrayList; 
import java.lang.reflect.Array; 

public class ExtremeCoder<K> extends ArrayList<K> 
{ 
    public K[ ] toArray(Class<K[ ]> clazz) 
    { 
     K[ ] result = clazz.cast(Array.newInstance(clazz.getComponentType(), this.size())); 
     int index = 0; 
     for(K k : this) 
     result[index++] = k; 
     return result; 
    } 
} 

Ceci vous donnera un tableau du type que vous voulez avec la sécurité de type garanti. Comment cela fonctionne est expliqué en profondeur dans my answer à une question similaire depuis un certain temps.