2008-12-27 30 views
28

sólo para su revisión, puede alguien explicar rápidamente lo que impide que esto de trabajo (en la compilación):cuestión de Java rápida: Fundición una serie de objetos en una matriz de mi clase pretendido

private HashSet Data; 

... 

public DataObject[] getDataObjects() 
{ 
    return (DataObject[]) Data.toArray(); 
} 

... y lo que hace esto de la manera que hace el trabajo:

public DataObject[] getDataObjects() 
{ 
    return (DataObject[]) Data.toArray(new DataObject[ Data.size() ]); 
} 

no me queda claro en el mecanismo en el trabajo con la fundición (o lo que sea) que hace de esta manera.

Respuesta

37

Porque toArray() crea una matriz de Objeto, y no puede hacer Object[] en DataObject[] con solo echarlo. toArray(DataObject[]) crea una matriz de DataObject.

Y sí, es una deficiencia de la clase Collections y de la forma en que Generics fueron calzados en Java. Es de esperar que Collection<E>.toArray() pueda devolver una matriz de E, pero no es así.

Lo interesante de la llamada toArray(DataObject[]): no es necesario que la matriz "a" sea lo suficientemente grande, por lo que puede llamarla con toArray(new DataObject[0]) si lo desea.

Llamarlo como toArray(new DateObject[0]) es en realidad mejor si utiliza .length más adelante para obtener la longitud del conjunto. Si la longitud inicial era grande y la misma matriz de objetos que ha pasado se volvió entonces puede enfrentar NullPointerException s posteriores

he hecho una pregunta anterior sobre genéricos de Java, y se señaló a este FAQ que era muy útil: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

+0

Ok. ¿Hay alguna forma de lanzar Object [] a DataObject [] entonces? No entiendo para qué existe esa función, de lo contrario. Lo siento, estoy tratando de hacer estas estúpidas preguntas fuera del camino ahora para que no me atormenten más tarde. –

+0

Me temo que no hay. Solo tiene que usar el otro para llamar a Array. –

+0

No, puedes crear una nueva matriz y lanzar tus objetos uno por uno. Sin embargo, en Java, los arreglos casi nunca son el camino a seguir. – Henning

3

Para garantizar la seguridad del tipo al crear una matriz como la que pretendía (DataObject[] dataArray = (DataObject[]) objectArray;), la JVM debería inspeccionar todos los objetos de la matriz, por lo que no es una operación simple como un tipo de conversión. Creo que es por eso que debe pasar la instancia de matriz, que luego se llena con la operación toArray().

Cuestiones relacionadas