faça arrayList.toArray () retornar tipos mais específicos


189

Então, normalmente ArrayList.toArray()retornaria um tipo de Object[].... mas supostamente é um Arraylistobjeto Custom, como faço toArray()para retornar um tipo de, Custom[]e não Object[]?


1
Existem 2 métodos com o mesmo nome 'toArray ()' em ArrayList. A partir de 1.5, o segundo método leva a matriz digitada. Você está procurando uma solução para pré-1,5?
Ritesh

Respostas:


308

Como isso:

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

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

Antes do Java6, era recomendável escrever:

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

porque a implementação interna realocaria uma matriz de tamanho adequado de qualquer maneira, portanto, seria melhor fazê-lo antecipadamente. Como Java6, a matriz vazia é preferida, consulte .toArray (nova MyClass [0]) ou .toArray (nova MyClass [myList.size ()])?

Se sua lista não for digitada corretamente, você precisará fazer uma conversão antes de ligar para o Arrray. Como isso:

    List l = new ArrayList<String>();

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

1
AFAIK: Isso tem algo a ver com Java como um todo, sendo incapaz de usar construtores genéricos. Portanto, embora saiba que você precisa dele para converter um objeto como String [] ou MyObject [], ele não pode instanciar por conta própria.

E se, em vez de String, queremos usar o dobro? Parece falhar ... Podemos usar o dobro, mas e se eu quiser o dobro?
Pixel

2
@pbs Você não pode. Os genéricos de Java suportam apenas tipos de referência, não primitivos. O encaixotamento automático / desembalagem deve permitir que você ignore a diferença entre eles na maior parte do tempo.
Solarshado

16

Realmente não precisa retornar Object[], por exemplo: -

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

Aqui está a minha Customturma: -

public class Custom {
    private int i;

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

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


1

Eu recebi a resposta ... isso parece estar funcionando perfeitamente bem

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

Amostras:

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

1
E se tivermos ArrayList <Animal> e ele contiver tipos de cães e gatos que estendem Animal? Parece que falharia se o primeiro elemento fosse Dog e o próximo fosse Cat. Ele vê o primeiro elemento, cria uma matriz do tipo Dog, adiciona o cachorro e tenta adicionar o gato e falha. Também pode não funcionar com E. genérico
ptoinson
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.