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

Alb*_*ert 39 java iterator iterable

我想知道为什么这个Collection.addAll()方法只接受其他Collections但不接受Iterables.这是为什么?

Iterables 做任何类似的方法?

Mic*_*rdt 39

大概是因为Collection接口是在Java 1.2中引入的,而Iterable只出现在1.5中,并且更改接口会破坏所有现有的实现.

  • 这并不能解释为什么不随后添加该方法. (2认同)
  • Java允许方法重载,对吗? (2认同)
  • 这并不能解释为什么它不是作为Java 8中的默认方法添加的.我倾向于[@ OscarRyz的答案](http://stackoverflow.com/a/3832084/1553851)它与它有关`Collection`代表一组有限的元素. (2认同)

Mic*_*vis 32

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

  • +1 for*如有疑问,请务必检查番石榴*.大多数apache commons libs都很棒,但是commons/collections很烦人,因为它不支持泛型. (5认同)

TWi*_*Rob 11

其他人广泛地回答了"为什么".

有什么类似的方法为Iterables做到这一点?

在Java 8中,您不再需要addAll:

Collection<X> coll = ...;
Iterable<X> it = ...;
it.forEach(coll::add); // coll.addAll(it);
Run Code Online (Sandbox Code Playgroud)


Osc*_*Ryz 10

基本上因为一个Iterable可能永远不会结束(也就是hasNext()永远地回归真实).

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

  • 不确定我同意.Collection可以像Iterable一样无限,因为你可以构造一个有效的Collection作为Iterable的包装器. (6认同)
  • 没关系,我检查了文档http://download.oracle.com/javase/6/docs/api/java/util/Collection.html#size%28%29它应该返回Integer.MAX_VALUE (4认同)