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

Java: почему Collection.addAll не может принимать Iterables?

Интересно, почему метод Collection.addAll() принимает только другие Collection, но не Iterable s. Почему это?

Любой аналогичный метод для Iterable s?

4b9b3361

Ответ 1

Предположительно, потому что интерфейс Collection был введен в Java 1.2, тогда как Iterable появился только в 1.5, и изменение интерфейса приведет к поломке всех существующих реализаций.

Ответ 2

Если вы сомневаетесь, всегда проверяйте Guava (или Commons):

Ответ 3

Другие ответили "почему" широко.

Любой аналогичный метод для этого для Iterables?

В Java 8 вам больше не нужно addAll:

Collection<X> coll = ...;
Iterable<X> it = ...;
it.forEach(coll::add); // coll.addAll(it);

Ответ 4

В основном потому, что Iterable никогда не может закончиться (то есть hasNext() вернуть true навсегда).

Кроме того, чтобы сохранить конгруэнтность, вы можете подумать, что Collection может добавить все элементы другой коллекции, но Iterable не обязательно представляет собой набор (это может быть что угодно, например, a ResultSet wrapper для экземпляр).

Ответ 5

В базовом JDK есть довольно много вещей, которые не так хорошо работают с простыми итерациями, как могли бы. Я бы порекомендовал использовать гуаву, чтобы преодолеть многие из этих недостатков.