41 votes

Pourquoi ne pas Java varargs soutien des collections?

Dans mon code Java, j'utilise souvent les très maniable method(Class... args) varargs. Autant que je sache, ils vous permettent de passer n'importe quel montant d' Class objets ou un tableau d' Class[]. Depuis j'ai aussi souvent utiliser le Java classes de collection, je suis frustré par le manque de compatibilité entre les deux. En conséquence, j'ai fini par faire collection.toArray(), mais qui a un certain type de problèmes de sécurité.

Alors maintenant, pour la question: pourquoi ne pas Java permettre à des instances d' Iterable<T> comme vararg arguments, aussi longtemps que le type générique correspond à l' T... type de la vararg? N'est pas tout le monde d'utiliser des listes, ensembles, etc. tout le temps? Est-il facile, de type moyen sûr de fournir la conversion de la collecte à la vararg?

48voto

Joachim Sauer Points 133411

La raison en est simple: une variable arité paramètre est simplement un vieux de la vieille école de la matrice de paramater avec certains des métadonnées supplémentaires qui indique au compilateur de fournir certaines sucre syntaxique (à savoir, il permet implicite de la création de la matrice).

Du point de vue de la JVM Object... est à peu près le même que Object[]. Permettant des collections aurait besoin d'un plus envahissantes changement à la JVM (qui n'a pas de soutien explicite pour les collections à date).

Notez que si vous voulez à l'appui de deux façons, de faire la collection de base de la méthode est probablement la meilleure approche:

public void frobnicate(Object... args) {
  frobnicate(Arrays.asList(args));
}

public void frobnicate(Iterable<Object> args) {
  // do stuff
}

La raison pour cela est que l'utilisation d' Arrays.asList() est généralement moins cher qu' Collection.toArray() "(car il crée un simple wrapper).

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