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

Première: Ai-je besoin d'un modèle ici? (Je pense que nous devrions écrire comme (String[])c.toArray(); Mais je l'ai vu comme juste c.toArray() sans utiliser transtypage Est-ce valableDevrions-nous utiliser cast pour l'objet object.toArray()?

Deuxièmement:.? Pourquoi nous écrivons new String[0]

+0

dépend du type de c. – gimel

+0

note: vous pouvez également utiliser 'c.toArray (new String [] {});' –

Répondre

12

La conversion de type est généralement nécessaire uniquement si vous utilisez des pré-génériques Java. . Si vous regardez la documentation pour Collection.toArray(T[]) vous verrez qu'il sait que le type du tableau qui est retourné est le même que le type de tableau passé en Ainsi, vous pouvez écrire:

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

Vous passez dans le tableau pour dire à la collection quel type de résultat vous voulez, ce qui peut ne pas être le même que le type dans la collection. Par exemple, si vous avez un List<OutputStream> vous voudrez peut-être le convertir en un Object[], un Stream[] ou un ByteArrayOutputStream[] - évidemment ce dernier ne fonctionnera que si chaque élément estByteArrayOutputStream. Cela signifie également que si vous avez déjà un tableau du bon type et de la bonne taille, le contenu peut être copié dans celui-ci au lieu de créer un nouveau tableau.

Une version précédente de cette réponse était inexacte par la voie - si vous utilisez la surcharge qui ne prend aucun paramètre, vous toujours récupérer un Object[] qui ne peut pas être jeté:

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: Je viens de remarquer que cela est également mentionné dans la réponse d'erdemoo, mais ça ne peut pas faire mal ici :)

+0

Pouvons-nous dire que j'écris new String [0] pour ne pas retourner null comme le résultat ???? – Johanna

+0

(Clarifié et corrigé). Je ne comprends pas vraiment le commentaire si Johanna - pourriez-vous expliquer ce que vous voulez dire un peu plus? –

+0

est-il vrai que si les éléments du tableau sont plus que la collection, nous pouvons utiliser ** new String [0] ** ?? – Johanna

1
  1. Oui vous avez besoin du baissés depuis? Le type de retour de toArray est Object []

  2. Vous devez passer (new String [0]) en paramètre car la méthode doit connaître le type de tableau à retourner (tableau de chaînes, dates, etc.) En interne, tous les éléments de la liste sont en réalité des objets, de sorte que la liste ne connaît pas le type d'éléments qu'elle contient Il ne sait donc pas quel type de tableau il doit renvoyer, sauf si vous le fournissez en tant que paramètre.

+1

bien, mais je pense que nous avons besoin d'être nuancé ici !!! – Johanna

4

si vous utilisez list.toArray(), il vous retournera . L'incantation vers un tableau String lancera une exception même si les éléments stockés dans la liste sont du type String.

Si vous utilisez list.toArray (Object [] a), les éléments de la liste seront stockés dans un tableau "a". Si les éléments de la liste sont String et que vous donnez String array alors il va stocker des éléments dans String array, si array n'est pas assez grand pour stocker des éléments dans la liste, alors il développera la liste donnée.

Questions connexes