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

帕特里克·M:

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

将我的结果集合更改为使用更通用的Collection<? extends Integer>类型并不能消除该行的未经检查的警告。另外,我不能将方法签名更改为接受a Collection而不是an,Iterable因为那样它就不再覆盖super方法,并且在需要时不会被调用。

目前似乎没有被周围的方式该铸造或拷贝的问题:其他问题已经问这里的其他地方似乎深深扎根于Java的泛型和类型擦除系统。但是我想问的是,是否有可以实现Iterable<T>但又不实现的类Collection<T>我已经看过IterableJavaDoc,当然,我希望传递给接口的所有内容实际上都是一个集合。我想使用一个狂野的,预先编写的类,因为这似乎更有可能实际作为参数传递,并使单元测试的价值更大。

由于我正在编写一些单元测试,我敢肯定我写的转换或复制位与我在项目中使用的类型兼容。但我想编写一个单元测试的一些输入端,一个可迭代但不是一个集合,到目前为止,所有我已经能够拿出正在实施一个虚拟的测试类实现自己。


出于好奇,我正在实现的方法是Guava的CacheLoader<K, V>.loadAll(Iterable<? extends K> keys)方法,后备方法是JDBI实例化的数据访问对象,该方法要求将集合用作@BindIn接口的参数类型我认为这与问题是相切的,我是正确的,但以防万一有人想尝试对我的问题进行横向思考。我知道我可以派生JDBI项目并重写@BindIn注释以接受可迭代的...

帕特里克·M:

在阅读了出色的答案并提供了文档之后,我又翻了几节课,发现无论从测试代码的直接性还是直接的问题标题来看,看起来都是赢家。Java的主要ArrayList实现包含以下gem:

public Iterator<E> iterator() {
    return new Itr();
}

Itr私有内部类在哪里,其中包含的高度优化的定制实现Iterator<E>不幸的是,Iterator它本身并没有实现Iterable,所以如果我想把它塞进我的助手方法中以测试不进行强制转换的代码路径,则必须将其包装在自己的实现Iterable(而不是实现Collection的垃圾类中,返回Itr这是一种方便的方法,可以轻松地将集合变成Iterable,而不必自己编写迭代代码。

最后一点,我的最终版本代码甚至都没有进行强制转换,因为Guava Lists.newArrayList几乎完全按照问题中的运行时类型检测进行了操作。

@GwtCompatible(serializable = true)
public static <E> ArrayList<E> More ...newArrayList(Iterable<? extends E> elements) {
  checkNotNull(elements); // for GWT
  // Let ArrayList's sizing logic work, if possible
  if (elements instanceof Collection) {
    @SuppressWarnings("unchecked")
    Collection<? extends E> collection = (Collection<? extends E>) elements;
    return new ArrayList<E>(collection);
  } else {
    return newArrayList(elements.iterator());
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java:如何在不实现接口的情况下评估EL表达式-独立(在任何Web框架之外)?

C ++标准是否允许在没有开销的情况下实现std :: optional <double>

如何在不实际运行代码的情况下知道实现Comparable <>的类的排序顺序?

打字稿:在不实现函数的情况下声明函数

在不实现IEnumerable的情况下支持foreach的示例

如何在不实现函数的情况下声明函数?

是否有Java的浮点元任何IEEE 754标准实现?

我们可以在不实现IEnumerable的情况下使用Linq根据其ID对类进行排序吗

是否可以在不实现`Index`特征的情况下通过字段名称获取结构中的值?

在一种情况下,如何实现具有明显不同的实现的类?

在类不实现相同子接口的情况下,将接口与多个类一起使用的最佳方法是什么?

我可以在不实现子构造函数的情况下创建Perl子类吗?

如何在不实现的情况下使用源队列并将其返回给调用方?

在不实现Asp.Net Identity框架的情况下使用PasswordHasher

如果我在不实现OnInit接口的情况下使用ngOnInit方法会发生什么

如何在没有默认构造函数的情况下实现抽象类的Decorator类?

在特殊情况下,是否有任何命令读取其标准输入?

我想在没有任何包的情况下实现 OTP 验证屏幕

如何在不实现存根类的情况下为Mockito接口生成间谍?

是否可以在不实例化类的情况下导入类方法?

在没有限定的情况下从 T 构造函数调用 T 类的纯虚拟实现?

没有类的情况下如何实现此功能-Python 3 Tkinter

如何在没有CWinApp派生类的情况下实现MFC序列化?

在不破坏实现的情况下向类添加方法

是否可以在没有指针的情况下实现引用传递?

折叠后是否可以在没有后处理步骤的情况下实现单词功能?

在Java中,“扩展”在这种情况下是否也意味着“实现”?

在C ++中,是否有一种(新的)方法可以在不实例化实例的情况下测试类在模板中是否具有虚拟析构函数?

没有JPA的情况下如何实现持久锁?