Java: почему Collection.addAll не может принимать Iterables? - PullRequest
39 голосов
/ 30 сентября 2010

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

Любой подобный способ сделать это для Iterable с?

Ответы [ 5 ]

38 голосов
/ 30 сентября 2010

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

31 голосов
/ 30 сентября 2010

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

11 голосов
/ 03 августа 2016

Другие подробно ответили на вопрос «почему».

Есть ли подобный способ сделать это для Iterables?

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

Collection<X> coll = ...;
Iterable<X> it = ...;
it.forEach(coll::add); // coll.addAll(it);
9 голосов
/ 30 сентября 2010

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

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

4 голосов
/ 30 сентября 2010

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

...