是否有任何 Java 标准类在不实现 Collection 的情况下实现 Iterable?

2022-09-01 22:50:26

我有一个难题,这让我思考是否有任何标准的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>CollectionIterable

似乎没有办法解决这个强制转换或复制的问题:其他地方也提出了其他问题,它似乎深深植根于Java的通用和类型擦除系统。但是我问的是,是否有任何可以实现的类不同时实现?我已经浏览了可迭代的JavaDoc,当然,我希望传递给我的接口的所有内容实际上都是一个集合。我想使用一个在野外,预先编写的类,因为它似乎更有可能作为参数传递,并且会使单元测试更有价值。Iterable<T>Collection<T>

我敢肯定,由于我正在编写的一些单元测试,我编写的强制转换或复制位适用于我在项目中使用它的类型。但是我想为一些可迭代但不是集合的输入编写一个单元测试,到目前为止,我所能做的就是自己实现一个虚拟测试类实现。


对于好奇的人来说,我正在实现的方法是Guava的CacheLoader<K,V>.loadAll(Iterable<?扩展K>键),支持方法是JDBI实例化的数据访问对象,这需要将集合用作@BindIn接口的参数类型。我认为我认为这与问题有关是正确的,但以防万一有人想尝试对我的问题进行横向思考。我知道我可以分叉JDBI项目并重写注释以接受可迭代的...@BindIn


答案 1

虽然没有一个类可以立即满足您的需求并且对测试代码的读者来说很直观,但您可以轻松创建自己的易于理解的匿名类:

static Iterable<Integer> range(final int from, final int to) {
    return new Iterable<Integer>() {
        public Iterator<Integer> iterator() {
            return new Iterator<Integer>() {
                int current = from;
                public boolean hasNext() { return current < to; }
                public Integer next() {
                    if (!hasNext()) { throw new NoSuchElementException(); }
                    return current++;
                }
                public void remove() { /*Optional; not implemented.*/ }
            };
        }
    };
}

演示。

此实现是匿名的,并且不实现 。另一方面,它生成一个非空的可枚举整数序列,您可以完全控制该序列。Collection<Integer>


答案 2

要根据标题回答问题:

是否有任何 Java 标准类在不实现的情况下实现?IterableCollection

从文本:

如果有任何可以实现的类不同时实现?Iterable<T>Collection<T>

答:

是的

请参阅以下 javadoc 页面:https://docs.oracle.com/javase/8/docs/api/java/lang/class-use/Iterable.html

任何说 ,的章节都会列出实现接口的 Java 标准类。其中许多没有实现。Classes in XXX that implement IterableCollection