toArray dúvida

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. :slight_smile: