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.
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 à NullPointerException
s 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
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.