Sm, mas não resolve meu problema:
[code]return (T[]) list.toArray(new Object[0]);
Exception in thread “main” java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
[/code][/quote]
Isso parece um daqueles ClassCastExceptions obscuros que na verdade vem de métodos bridge, que são aqueles métodos sintéticos inseridos pelo compilador que fazem casts para lidar com generics.
O compilador deve estar criando um método bridge assim:private static String[] cortarNulos(String[] array) {
// Aqui o compilador linka o método original.
return (String[]) cortarNulos(array);
}
E é este cast sintético que está gerando o seu ClassCastException.
O problema é a assinatura do método cortarNulos(T[]). Ele deve retornar Object[] e não T[].
Conforme em alguns post anteriores, o problema é que o método toArray(new Object[]) retorna um Object[], porem, seu metodo generico foi tipado para String e espera um retorno do tipo String[] e voce esta passando como retorno Object[].
Abracao
Achei uma solução
return list.toArray((T[]) Array.newInstance(list.iterator().next().getClass(), list.size()));
Obs: tem que haver pelo menos um objeto na lista.
Fonte: http://cleveralias.blogs.com/thought_spearmints/2005/02/creating_an_arr.html
Edit: troquei 0 por list.size.
[quote=Bruno Laturner]Achei uma solução
return list.toArray((T[]) Array.newInstance(list.iterator().next().getClass(), 0));
Obs: tem que haver pelo menos um objeto na lista.
Fonte: http://cleveralias.blogs.com/thought_spearmints/2005/02/creating_an_arr.html[/quote]
Criativo, mas é uma puta gambiarra. :lol: :lol:
[Maldito type-erasure]
Pronto, uma versão sem gambiarra:
[code] public static T[] cortarNulos(T[] array)
{
if (array.length == 0)
return array;
ArrayList<T> list = new ArrayList<T>(array.length);
for (T a : array)
{
if (a != null)
list.add(a);
}
return list.toArray((T[]) Array.newInstance(array.getClass().getComponentType(), list.size()));
}[/code]
E ainda funciona com arrays zero-dimensionais e arrays só com nulos, retorna zero-dimensionais do mesmo tipo, do jeito que queria.
[quote=Bruno Laturner]Pronto, uma versão sem gambiarra:
[code] public static T[] cortarNulos(T[] array)
{
if (array.length == 0)
return array;
ArrayList<T> list = new ArrayList<T>(array.length);
for (T a : array)
{
if (a != null)
list.add(a);
}
return list.toArray((T[]) Array.newInstance(array.getClass().getComponentType(), list.size()));
}[/code]
E ainda funciona com arrays zero-dimensionais e arrays só com nulos, retorna zero-dimensionais do mesmo tipo, do jeito que queria.[/quote]
Realmente. Essa parece ser a solução certa.