web-dev-qa-db-fra.com

Casting d'un tableau d'objets dans un tableau de ma classe prévue

Juste pour examen, quelqu'un peut-il expliquer rapidement ce qui empêche cela de fonctionner (lors de la compilation):

private HashSet data;

...

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

... et ce qui fait que cela fonctionne:

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

Je ne suis pas clair sur le mécanisme à l'œuvre avec le casting (ou quoi que ce soit) qui rend cela ainsi.

28
Daddy Warbox

Parce que toArray() crée un tableau d'objets, et vous ne pouvez pas transformer Object[] En DataObject[] Simplement en le castant. toArray(DataObject[]) crée un tableau de DataObject.

Et oui, c'est une lacune de la classe Collections et de la façon dont les génériques ont été intégrés à Java. Vous vous attendriez à ce que Collection<E>.toArray() puisse retourner un tableau de E, mais ce n'est pas le cas.

Chose intéressante à propos de l'appel toArray(DataObject[]): vous n'avez pas besoin de rendre le tableau "a" assez grand, vous pouvez donc l'appeler avec toArray(new DataObject[0]) si vous le souhaitez.

L'appeler comme toArray(new DateObject[0]) est en fait mieux si vous utilisez .length Plus tard pour obtenir la longueur du tableau. si la longueur initiale était grande et que le même objet tableau que vous avez passé a été renvoyé, vous pouvez faire face à NullPointerExceptions plus tard

J'ai posé une question plus tôt à propos des génériques Java, et je l'ai signalé à FAQ qui a été très utile: http: //www.angelikalanger. com/GenericsFAQ/JavaGenericsFAQ.html

38
Paul Tomblin

Pour garantir la sécurité des types lors de la conversion d'un tableau comme vous le souhaitiez (DataObject[] dataArray = (DataObject[]) objectArray;), la JVM devrait inspecter chaque objet du tableau, ce n'est donc pas une opération simple comme une conversion de type. Je pense que c'est pourquoi vous devez passer l'instance de tableau, que l'opération toArray() remplit ensuite.

3
Henning