Почему Java varargs не поддерживает коллекции? - PullRequest
41 голосов
/ 01 августа 2011

В моем Java-коде я часто использую очень удобные method(Class... args) varargs. Насколько я знаю, они позволяют передавать любое количество Class объектов или массив Class[]. Поскольку я также часто использую классы Java-коллекций, я разочарован отсутствием совместимости между ними. В результате я получаю collection.toArray(), но у него есть проблемы с безопасностью типов.

Итак, теперь вопрос: почему Java не допускает экземпляры Iterable<T> в качестве аргументов vararg, если универсальный тип соответствует типу T... vararg? Не все ли постоянно используют списки, наборы и т. Д.? Есть ли простой, безопасный для типов способ обеспечить преобразование из коллекции в vararg?

1 Ответ

48 голосов
/ 01 августа 2011

Причина проста: переменный параметр arity является просто параметром массива старой школы с некоторыми дополнительными метаданными, которые сообщают компилятору предоставить некоторый синтаксический сахар (а именно, он позволяет неявное создание массива).

Итакс точки зрения JVM Object... в значительной степени совпадает с Object[].Разрешение коллекций также потребовало бы более инвазивного изменения в JVM (которая на данный момент не имеет явной поддержки коллекций).

Обратите внимание, что если вы хотите поддерживать оба способа, то создание метода на основе коллекции, вероятно,лучший подход:

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

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

Причина этого заключается в том, что использование Arrays.asList() является обычно более дешевой операцией, чем Collection.toArray() (поскольку она создает простую оболочку).

...