Pergunta

Na estrutura de coleções Java, a interface Collection declara o seguinte método:

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

Retorna um array contendo todos os elementos desta coleção;o tipo de tempo de execução da matriz retornada é o da matriz especificada.Se a coleção couber no array especificado, ela será retornada nele.Caso contrário, um novo array será alocado com o tipo de tempo de execução do array especificado e o tamanho desta coleção.

Se você quisesse implementar este método, como criaria um array do tipo a, conhecido apenas em tempo de execução?

Foi útil?

Solução

Use o método estático

java.lang.reflect.Array.newInstance(Class<?> componentType, int length)

Um tutorial sobre seu uso pode ser encontrado aqui:http://java.sun.com/docs/books/tutorial/reflect/special/arrayInstance.html

Outras dicas

Observando como ArrayList faz isso:

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;
}
Array.newInstance(Class componentType, int length)

Para criar um novo array de um tipo genérico (que só é conhecido em tempo de execução), você deve criar um array de Objetos e simplesmente convertê-lo no tipo genérico e então usá-lo como tal.Esta é uma limitação da implementação genérica de Java (apagamento).

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

A função então pega o array fornecido (a) e o utiliza (verificando seu tamanho previamente) ou cria um novo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top