我什么时候应该接受 Java 中的 Iterable<T> 与 Collection<T> 的参数?

2022-08-31 12:17:33

在Java中使用迭代<T>Collection<T>有什么注意事项?

例如,考虑实现一个主要关注包含 s 集合和一些关联元数据的类型。此类型的构造函数允许对对象列表进行一次性初始化。(元数据可以稍后设置。此构造函数应接受哪种类型?或?FooIterable<Foo>Collection<Foo>

此决定的注意事项是什么?

遵循库类型(例如(可以从任何初始化,但不能初始化))将引导我使用。ArrayListCollectionIterableCollection<Foo>

但是为什么不接受,因为这足以满足初始化需求呢?为什么要求消费者提供比严格必要的()更高级别的功能()?Iterable<Foo>CollectionIterable


答案 1

许多集合类型在 Iterable<T>(仅在 1.5 中引入)之前就已经存在了 - 没有理由添加一个构造函数来接受 Collection<T>但更改现有构造函数将是一个重大更改。Iterable<T>

就我个人而言,如果这允许你做任何你想做的事情,我会用。它对调用者来说更加灵活,特别是它允许您使用Google Java Collections(毫无疑问是类似的库)进行相对容易的过滤/投影/等。Iterable<T>


答案 2

产生对象。根据定义,对象是迭代的。请注意,该接口不承诺在返回之前可以调用多少次。可能在其方法返回 之前循环访问值。IterableIteratorIteratorIteratornext()hasNext()falseIteratorInteger.MAX_VALUE + 1hasNext()false

但是,a 是 的特殊形式。因为 a 不能有超过元素(通过方法),所以自然而然地假定它的对象不会迭代这么多元素。CollectionIterableCollectionInteger.MAX_VALUEsize()Iterator

因此,通过接受 a 而不是 a,您的类可以保证传入的元素数。如果您的类本身是 .CollectionIterableCollection

只是我的两分钱...