32 votes

Question Java rapide: 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.

40voto

Paul Tomblin Points 83687

Parce qu' toArray() crée un tableau d'Objet, et vous ne pouvez pas faire d' Object[] en DataObject[] seulement par moulage. toArray(DataObject[]) crée un tableau d' DataObject.

Et oui, c'est une lacune de la Collections de la classe et de la manière de médicaments Génériques ont été entassé dans Java. Vous attendez qu' Collection<E>.toArray() pourrait retourner un tableau de E, mais il ne le fait pas.

Chose intéressante à propos de l' toArray(DataObject[]) appel: vous n'avez pas à faire la "une" tableau assez grand, de sorte que vous pouvez appeler avec des toArray(new DataObject[0]) si vous le souhaitez.

L'appelant comme toArray(new DateObject[0]) est effectivement mieux si vous utilisez .length plus tard à la longueur du tableau. si la longueur initiale était de grande taille et la même matrice de l'objet que vous avez passé a été retourné, vous pouvez faire face NullPointerExceptions plus tard

J'ai posé une question plus haut à propos de Java génériques, et a été rappelé à cette FAQ qui a été très utile: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

3voto

Henning Points 8776

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, il ne s'agit donc pas en fait d'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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X