make arrayList.toArray () retourne des types plus spécifiques


189

Donc, normalement ArrayList.toArray()retournerait un type de Object[].... mais supposé que c'est un Arraylistobjet Custom, comment faire toArray()pour retourner un type de Custom[]plutôt que Object[]?


1
Il existe 2 méthodes avec le même nom «toArray ()» dans ArrayList. À partir de 1.5, la deuxième méthode utilise un tableau typé. Cherchez-vous une solution pour la pré-1.5?
Ritesh

Réponses:


308

Comme ça:

List<String> list = new ArrayList<String>();

String[] a = list.toArray(new String[0]);

Avant Java6, il était recommandé d'écrire:

String[] a = list.toArray(new String[list.size()]);

parce que l'implémentation interne réallouerait de toute façon un tableau correctement dimensionné, donc vous feriez mieux de le faire à l'avance. Depuis Java6, le tableau vide est préféré, voir .toArray (new MyClass [0]) ou .toArray (new MyClass [myList.size ()])?

Si votre liste n'est pas correctement saisie, vous devez effectuer un cast avant d'appeler toArray. Comme ça:

    List l = new ArrayList<String>();

    String[] a = ((List<String>)l).toArray(new String[l.size()]);

1
AFAIK: Cela a quelque chose à voir avec Java dans son ensemble, étant incapable d'utiliser des constructeurs génériques. Ainsi, bien qu'il sache que vous en avez besoin pour vous convertir un objet comme String [] ou MyObject [], il ne peut pas l'instancier seul.

Et si au lieu de String nous voulions utiliser double? Cela semble échouer ... On peut utiliser Double, mais que faire si je veux double?
Pixel

2
@pbs Vous ne pouvez pas. Les génériques de Java ne prennent en charge que les types de référence, pas les primitives. Cependant, l'auto-boxing / unboxing devrait vous permettre d'ignorer la différence entre eux pour la plupart.
solarshado le

16

Il n'a pas vraiment besoin de revenir Object[], par exemple: -

    List<Custom> list = new ArrayList<Custom>();
    list.add(new Custom(1));
    list.add(new Custom(2));

    Custom[] customs = new Custom[list.size()];
    list.toArray(customs);

    for (Custom custom : customs) {
        System.out.println(custom);
    }

Voici ma Customclasse: -

public class Custom {
    private int i;

    public Custom(int i) {
        this.i = i;
    }

    @Override
    public String toString() {
        return String.valueOf(i);
    }
}


1

J'ai la réponse ... cela semble fonctionner parfaitement bien

public int[] test ( int[]b )
{
    ArrayList<Integer> l = new ArrayList<Integer>();
    Object[] returnArrayObject = l.toArray();
    int returnArray[] = new int[returnArrayObject.length];
    for (int i = 0; i < returnArrayObject.length; i++){
         returnArray[i] = (Integer)  returnArrayObject[i];
    }

    return returnArray;
}

0
@SuppressWarnings("unchecked")
    public static <E> E[] arrayListToArray(ArrayList<E> list)
    {
        int s;
        if(list == null || (s = list.size())<1)
            return null;
        E[] temp;
        E typeHelper = list.get(0);

        try
        {
            Object o = Array.newInstance(typeHelper.getClass(), s);
            temp = (E[]) o;

            for (int i = 0; i < list.size(); i++)
                Array.set(temp, i, list.get(i));
        }
        catch (Exception e)
        {return null;}

        return temp;
    }

Échantillons:

String[] s = arrayListToArray(stringList);
Long[]   l = arrayListToArray(longList);

1
Et si nous avons ArrayList <Animal> et qu'il contient des types Dog et Cat qui étendent Animal? On dirait que cela échouerait si le premier élément est Dog et le suivant est Cat. Il voit le premier élément, crée un tableau de type Chien, ajoute le chien puis essaie d'ajouter le chat et échoue. Peut également ne pas fonctionner avec E. générique
ptoinson le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.