Como instanciar um array Java dado um tipo de array em tempo de execução?
-
09-06-2019 - |
Pergunta
Na estrutura de coleções Java, a interface Collection declara o seguinte método:
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?
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.