O código a seguir (executado no Android) sempre me dá uma ClassCastException na 3ª linha:
final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();
Acontece também quando v2 é Object [0] e também quando há Strings nele. Alguma ideia do porquê?
java
list
classcastexception
toarray
Gavriel
fonte
fonte
toArray()
método.Respostas:
Isso ocorre porque quando você usa
ele retorna um Object [], que não pode ser lançado em um String [] (mesmo que o conteúdo seja Strings). Isso ocorre porque o método toArray só obtém um
e não
como os genéricos são apenas uma coisa de código-fonte, e não estão disponíveis em tempo de execução, portanto, ele não pode determinar que tipo de array criar.
usar
que aloca o tipo certo de array (String [] e do tamanho certo)
fonte
toArray
métodos existiam antes das classes de coleção serem genéricas.toArray(new String[0])
vez disso: "Em versões anteriores do Java, o uso de array pré-dimensionado era recomendado, pois a chamada de reflexão necessária para criar um array de tamanho adequado era bastante lenta. No entanto, desde as últimas atualizações do OpenJDK 6 essa chamada foi intrinsecada, tornando o desempenho da versão de array vazio o mesmo e às vezes até melhor. Também passar array pré-dimensionado é perigoso para uma coleção simultânea, pois uma corrida é possível entre a chamadasize
etoArray
. "Você está usando o errado
toArray()
Lembre-se de que os genéricos do Java são principalmente açúcar sintático. Um ArrayList não sabe realmente que todos os seus elementos são Strings.
Para resolver seu problema, ligue
toArray(T[])
. No seu caso,Observe que o formulário genérico
toArray(T[])
retornaT[]
, portanto, o resultado não precisa ser convertido explicitamente.fonte
também funciona, observe que você não precisa nem lançar mais uma vez que o ArrayType correto é fornecido ao método.
fonte
Use assim.
fonte