我想知道为什么
是否有类似的方法可以用于
Collection.addAll()
方法只接受其他Collection
而不是Iterable
。这是为什么呢?是否有类似的方法可以用于
Iterable
?可能是因为Java 1.2引入了Collection
接口,而Iterable
直到1.5才出现,更改接口将会破坏所有现有的实现。
Collections.addAll(coll, it)
方法,同时在Collection#addAll
上加上一个@see
。虽然它不能很聪明地进行参数下转换,但我相信大多数解决方法也没有这样做。 - TWiStErRob当有疑问时,始终要检查Guava(或Commons):
其他人已经详细回答了“为什么”的问题。
有没有类似的方法可以用于迭代器?
在Java 8中,你不再需要使用addAll
:
Collection<X> coll = ...;
Iterable<X> it = ...;
it.forEach(coll::add); // coll.addAll(it);
coll.add
。 - Jens基本上因为Iterable
可能永远不会结束(也就是说,hasNext()
会永远返回true)。
此外,为了保持一致性,您可能认为Collection
可以添加另一个集合的所有元素,但是,Iterable
并不一定是一个集合(它可以是任何东西,比如ResultSet
包装器)。
addAll
方法。 - AlbertremoveAll()
和 retainAll()
可能会无限执行。@OscarRyz 仅仅因为大小可能大于 Integer.MAX_VALUE
并不意味着它可以是无限的。而且接口甚至不能正确支持大于 Integer.MAX_VALUE
的集合,因为 toArray()
承诺返回所有元素,即使数组不能大于 Integer.MAX_VALUE
。 - shmosel在核心JDK中,有很多东西与普通的可迭代对象不太兼容。我建议使用Guava来克服这些缺点。
yourCollection.addAll(org.apache.commons.collections.IteratorUtils.toList(yourIterable.iterator()))
。 - mihijava.util.Arrays.asList()
。 - mihiIterable
。 - Steve Kuo