首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代器迭代器

迭代器迭代器
EN

Stack Overflow用户
提问于 2013-04-30 18:16:28
回答 4查看 3.7K关注 0票数 2

我正在尝试创建一个迭代器的迭代器,支持Java中的任何类型。其目的是迭代迭代器的对象。

但是我有一个类型不匹配,我不知道如何初始化我的实现。

我脑海中的第一个想法是让我的类实现Iterator<Iterator<T>>,但这行不通,因为下一个方法将具有签名public Iterator<T> next(),这与我想要做的事情不相符。我希望返回类型T,而不是返回Iterator<T>

因此,我创建了另一个与Iterator接口非常相似的接口:

代码语言:javascript
复制
  public interface MyIterator<T extends Iterator<T>> {

    public boolean hasNext();

    public T next();
}

我的迭代器接受类型T,这是一个迭代器。下面是我的实现(没有删除):

代码语言:javascript
复制
public class IteratorOfIterator<T extends Iterator<T>> implements MyIterator<T> {

private T[] iterators;

private T currentIterator;

private int currentIndex;

public IteratorOfIterator(T[] iterators){
    this.iterators = iterators;
    this.currentIndex = 0;
    this.currentIterator = iterators[currentIndex];
}

public boolean hasNext() {
    return currentIndex < iterators.length - 1 || currentIterator.hasNext();
}

public T next() {
    if(!this.currentIterator.hasNext()){
        currentIndex++;
        this.currentIterator = iterators[currentIndex];
    }
    return currentIterator.next();
}

如果我想测试我的迭代器,但我有一个类型不匹配,我如何初始化它?下面是我想做的一个例子:

代码语言:javascript
复制
String[] strings = {"peanut","butter","coco","foo","bar"};

Object[] iterators = {strings};

MyIterator<String> myIterator = new IteratorOfIterator<String>(iterators); // <-- in this line

错误为:Bound mismatch: The type String is not a valid substitute for the bounded parameter <T extends Iterator<T>> of the type IteratorOfIterator<T> IteratorOfIterator.java

我该如何解决这个问题?非常感谢你的建议。

PS:我完全理解这个问题。我知道,例如,类型字符串没有实现MyIterator接口,所以这就是为什么它不是一个很好的替代品。我的问题是我不知道怎么能

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-30 18:24:18

这是行不通的

代码语言:javascript
复制
public interface MyIterator<T extends Iterator<T>>

这意味着T本身必须是一个Iterator

您不希望T被限制为特定的类型,

代码语言:javascript
复制
public interface MyIterator<T>

但是您希望迭代器的类型是Iterator<T>

代码语言:javascript
复制
public class IteratorOfIterator<T> implements Iterator<T> {

private Iterator<T>[] iterators;

private Iterator<T> currentIterator;

private int currentIndex;

public IteratorOfIterator(Iterator<T>[] iterators){
    this.iterators = iterators;
    this.currentIndex = 0;
    this.currentIterator = iterators[currentIndex];
}

因此,您可以再次使用Iterator而不是MyIterator

票数 3
EN

Stack Overflow用户

发布于 2013-04-30 18:23:07

您可以使用

代码语言:javascript
复制
Iterator<String> myIterator = Arrays.asList(strings).iterator();

没有直接从Java数组获得迭代器的标准方法,因此您可以先将其转换为List,或者为数组构建自己的迭代器。

票数 0
EN

Stack Overflow用户

发布于 2013-04-30 18:38:50

您正在创建迭代器的迭代器,而构造函数定义了迭代器的数组,因此调用代码应该如下所示:

代码语言:javascript
复制
    List list1 = new ArrayList();
    List list2 = new ArrayList();
    Iterator<String> iterator1 = list1.iterator();
    Iterator<String> iterator2 = list2.iterator();      
    Iterator[] iteratorList = {iterator1, iterator2};    
    MyIterator<String> myIterator = new IteratorOfIterator(iteratorList);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16297452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档