Подтвердить что ты не робот

Почему Java varargs не поддерживает коллекции?

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

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

4b9b3361

Ответ 1

Причина проста: параметр переменной 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() (потому что оно создает простую оболочку).