是否有任何 Java 标准类在不实现 Collection 的情况下实现 Iterable?
我有一个难题,这让我思考是否有任何标准的java类在不实现的情况下实现。我正在实现一个接口,该接口要求我定义一个接受的方法,但是我用于支持此方法的对象需要一个 .Iterable<T>
Collection<T>
Iterable<T>
Collection<T>
这让我做了一些非常笨拙的感觉代码,这些代码在编译时会给出一些未经检查的警告。
public ImmutableMap<Integer, Optional<Site>> loadAll(
Iterable<? extends Integer> keys
) throws Exception {
Collection<Integer> _keys;
if (keys instanceof Collection) {
_keys = (Collection<Integer>) keys;
} else {
_keys = Lists.newArrayList(keys);
}
final List<Site> sitesById = siteDBDao.getSitesById(_keys);
// snip: convert the list to a map
将我生成的集合更改为使用更通用的类型并不能消除该行的未选中警告。另外,我无法将方法签名更改为接受 a 而不是 a,因为这样它就不再覆盖超级方法,并且不会在需要时被调用。Collection<? extends Integer>
Collection
Iterable
似乎没有办法解决这个强制转换或复制的问题:其他地方也提出了其他问题,它似乎深深植根于Java的通用和类型擦除系统。但是我问的是,是否有任何可以实现的类不同时实现?我已经浏览了可迭代
的JavaDoc,当然,我希望传递给我的接口的所有内容实际上都是一个集合。我想使用一个在野外,预先编写的类,因为它似乎更有可能作为参数传递,并且会使单元测试更有价值。Iterable<T>
Collection<T>
我敢肯定,由于我正在编写的一些单元测试,我编写的强制转换或复制位适用于我在项目中使用它的类型。但是我想为一些可迭代但不是集合的输入编写一个单元测试,到目前为止,我所能做的就是自己实现一个虚拟测试类实现。
对于好奇的人来说,我正在实现的方法是Guava的CacheLoader<K,V>.loadAll(Iterable<?扩展K>键),
支持方法是JDBI实例化的数据访问对象,这需要将集合用作@BindIn
接口的参数类型。我认为我认为这与问题有关是正确的,但以防万一有人想尝试对我的问题进行横向思考。我知道我可以分叉JDBI项目并重写注释以接受可迭代的...@BindIn