【问题标题】:Why methods of my Iterator cant be resolved?为什么我的迭代器的方法无法解析?
【发布时间】:2017-11-25 17:35:56
【问题描述】:

我正在为 Java 中的列表集合做某种“装饰器”。某事是错误的,我不知道它是什么。这是我的代码和观察到的错误。

1. myListContainer.java

public class myListContainer<T> implements List<T>{
    List<T> basicList;

    public myListContainer(List<T> basicList) {
        this.basicList = basicList;
    }

    @Override
    public Iterator<T> iterator() {         
        return new myIterator();
    }
    private class myIterator implements Iterator<T>{
        int actIndex;
        int visitTwice;

        public myIterator() {
            this.actIndex = 0;
            this.visitTwice = 0;
        }

        @Override
        public boolean hasNext() {
            if (actIndex < basicList.size() - 1)
                return true;
            else if (actIndex == basicList.size() - 1 &&visitTwice < 1)
                return true;
            return false;
        }

        @Override
        public T next() {
            if (this.hasNext()) {
                 if (visitTwice < 1) {
                     visitTwice = 1;
                     return basicList.get(actIndex);
                } else {
                    visitTwice = 0;
                    return basicList.get(actIndex++);
                }
            }
            throw new ArrayIndexOutOfBoundsException();
        }
    }

    //implementation of methods form List<T> interface

}

2. Client.java (psvm) 还有一个问题

public class Client {
    List<String> test = new myListContainer<>(Arrays.asList("Janek", 
              "Bartek", "Stefan", "Horacy", "Jakub", "Antoni"));

    boolean bl = test.iterator().hasNext();  //ok, 
    Iterator iter = test.iterator();
    iter.hasNext();                    //not ok, cannot resolve hasNext
}

问题:

1. test.iterator().hasNext() 工作正常

2. iter.hasNext() 不起作用,它不可见(hasNext),'无法解析符号'

编辑:当然所有文件都在一个模块中,并且有必要的导入。

【问题讨论】:

  • 不要调用你的迭代器Iterator ...那只是自找麻烦。将其命名为其他名称,例如 MyIterator&lt;T&gt;,在您声明(错误命名的)myIterator 的地方,将其命名为 MyIteratorImpl。一旦解决了名称冲突,您就可以开始解决代码中的其他问题。
  • 谢谢,是的,名字冲突太可怕了。但是,问题仍然存在。
  • 如果您需要帮助,请将您问题中的所有代码更新为当前状态,并解决名称冲突。否则你会浪费人们的时间。
  • 好的,我删除了接口 MyIterator,在这种情况下它是不必要的,现在应该更干净了

标签: java list collections iterator iterable


【解决方案1】:

问题是调用的范围,在这个类的范围内你应该初始化或声明成员/实例变量。 这是有效的 - boolean bl = test.iterator().hasNext(); //ok, Iterator iter = test.iterator();,因为它是类成员的声明。

因此,如果您尝试在函数范围内调用 hasNext() - 它会起作用。见例子:

public class Client {
    List<String> test = new myListContainer<>(Arrays.asList("Janek",
        "Bartek", "Stefan", "Horacy", "Jakub", "Antoni"));

    boolean bl = test.iterator().hasNext();  //ok, 
    Iterator iter = test.iterator();

    public void foo() {
        while (iter.hasNext()) { // here it will work!

        }
    }
}

【讨论】:

    【解决方案2】:

    非常抱歉,我不小心删除了我的主要功能,这是一个问题。再次抱歉。

    问题可能会被删除,这只是我的一个简单的错误,抱歉。

    【讨论】:

      猜你喜欢
      • 2016-10-28
      • 2017-08-16
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      相关资源
      最近更新 更多