2009-06-29 12 views
7
String[] a = c.toArray(new String[0]); 

Primero: ¿Necesito echar el tipo aquí? (Creo que hay que escribir como (String[])c.toArray(); pero he visto sólo como c.toArray() sin necesidad de utilizar el tipo fundido Es esto válido¿Deberíamos usar type cast para object.toArray()?

Segundo:.? También por qué escribimos new String[0]

+0

depende del tipo de c. – gimel

+0

nota: también puede usar 'c.toArray (new String [] {});' –

Respuesta

12

Por lo general, el molde de tipo solo es necesario si usa Java pregenérico. . Si nos fijamos en los documentos de Collection.toArray(T[]) verá que se sabe que el tipo de la matriz que se devuelve es el mismo que el tipo de matriz pasada en el Así, se puede escribir:

List<String> list = new ArrayList<String>(); 
list.add("Foo"); 
String[] array = list.toArray(new String[0]); 

Se pasa en la matriz para decirle a la colección qué tipo de resultado desea, que puede no ser el mismo que el tipo de la colección. Por ejemplo, si tiene un List<OutputStream> es posible que desee convertir eso a un Object[], un Stream[] o una ByteArrayOutputStream[] - obviamente, este último sólo va a funcionar si todos los elementos de hecho es un ByteArrayOutputStream. También significa que si ya tiene una matriz del tipo y tamaño correctos, los contenidos se pueden copiar en ese lugar en lugar de crear una nueva matriz.

Una versión anterior de esta respuesta fue incorrecta, por cierto - si se utiliza la sobrecarga que no toma ningún parámetro, que siempre vuelvas un Object[] que no puede ser fundido:

List<String> list = new ArrayList<String>(); 
list.add("Foo"); 

// toArray doesn't know the type of array to create 
// due to type erasure 
Object[] array = list.toArray(); 

// This cast will fail at execution time 
String[] stringArray = (String[]) arrray; 

EDIT: yo sólo he dado cuenta de esto también se menciona en la respuesta de erdemoo, pero no puede hacer daño a tener aquí también :)

+0

¿Podemos decir que escribo una cadena nueva [0] para no devolver nulo como resultado ???? – Johanna

+0

(aclarado y corregido). Aunque realmente no entiendo el comentario de Johanna, ¿podrías explicarme un poco más lo que quieres decir? –

+0

¿Es verdad que si los elementos de la matriz son más que la colección, podemos usar ** new String [0] ** ?? – Johanna

1
  1. Sí se necesitan los abatidos desde entonces? El tipo de devoluciones de Array es Object [].

  2. Debe pasar (nuevo String [0]) como parámetro ya que el método necesita saber qué tipo de matriz debe devolver (matriz de cadenas, fechas, etc.) Internamente, todos los elementos de la lista son en realidad objetos, por lo que la lista no sabe el tipo de elementos que contiene y, por lo tanto, no sabe qué tipo de matriz debería devolver, a menos que lo proporcione como parámetro.

+1

¡¡¡bien, pero creo que necesitamos un cambio de tendencia aquí !!! – Johanna

4

si está utilizando list.toArray(), se le volverá objeto de matriz . Casting a String array lanzará una excepción incluso si los elementos almacenados en la lista son de tipo String.

si está utilizando list.toArray (Object [] a), almacenará los elementos de la lista en "a" array. Si los elementos dentro de la lista son String y le da String array, almacenará los elementos dentro de String array, si la matriz dada no es lo suficientemente grande como para almacenar elementos dentro de la lista, entonces se ampliará la lista dada.

Cuestiones relacionadas