Ответ 1
Предположительно, потому что интерфейс Collection
был введен в Java 1.2, тогда как Iterable
появился только в 1.5, и изменение интерфейса приведет к поломке всех существующих реализаций.
Интересно, почему метод Collection.addAll()
принимает только другие Collection
, но не Iterable
s. Почему это?
Любой аналогичный метод для Iterable
s?
Предположительно, потому что интерфейс Collection
был введен в Java 1.2, тогда как Iterable
появился только в 1.5, и изменение интерфейса приведет к поломке всех существующих реализаций.
Если вы сомневаетесь, всегда проверяйте Guava (или Commons):
Другие ответили "почему" широко.
Любой аналогичный метод для этого для Iterables?
В Java 8 вам больше не нужно addAll
:
Collection<X> coll = ...;
Iterable<X> it = ...;
it.forEach(coll::add); // coll.addAll(it);
В основном потому, что Iterable
никогда не может закончиться (то есть hasNext()
вернуть true навсегда).
Кроме того, чтобы сохранить конгруэнтность, вы можете подумать, что Collection
может добавить все элементы другой коллекции, но Iterable
не обязательно представляет собой набор (это может быть что угодно, например, a ResultSet
wrapper для экземпляр).
В базовом JDK есть довольно много вещей, которые не так хорошо работают с простыми итерациями, как могли бы. Я бы порекомендовал использовать гуаву, чтобы преодолеть многие из этих недостатков.