Java:为什么Collection.addAll不能接受Iterables?

我想知道为什么Collection.addAll()方法只接受其他Collection而不是Iterable 。 这是为什么?

任何类似的方法来做这样的Iterable

推测是因为Collection接口是在Java 1.2中引入的,而Iterable只在1.5中出现,并且改变接口将会破坏所有现有的实现。

如有疑问,请检查番石榴(或下议院):

  • 番石榴: Iterables.addAll
  • Commons Collections: CollectionUtils.addAll

基本上,因为Iterable可能永远不会结束(也就是说, hasNext()永远返回true)。

另外,为了保持一致性,你可能会认为一个Collection可能会添加另一个集合的所有元素,但是Iterable并不一定是一个集合(可能是任何东西,比如ResultSet包装器)。

其他人则广泛地回答了“为什么”。

任何类似的方法来做这件事?

在Java 8中,你不需要addAll

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

核心JDK中有很多东西不能和普通的Iterables一样工作。 我build议使用番石榴克服很多这些缺点。