【问题标题】:Java - Need help to solve a bugJava - 需要帮助来解决错误
【发布时间】:2023-04-09 10:03:01
【问题描述】:

我目前正在学习 Java,为了我的内部类练习,我使用了以下代码:

public class DataStructure {

    // Create an array
    private final static int SIZE = 15;
    private int[] arrayOfInts = new int[SIZE];

    public DataStructure() {
        // fill the array with ascending integer values
        for (int i = 0; i < SIZE; i++) {
            arrayOfInts[i] = i;
        }
    }

    public void printEven() {

        // Print out values of even indices of the array
        DataStructureIterator iterator = this.new EvenIterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println();
    }

    interface DataStructureIterator extends java.util.Iterator<Integer> { } 

    // Inner class implements the DataStructureIterator interface,
    // which extends the Iterator<Integer> interface

    private class EvenIterator implements DataStructureIterator {

        // Start stepping through the array from the beginning
        private int nextIndex = 0;

        public boolean hasNext() {

            // Check if the current element is the last in the array
            return (nextIndex <= SIZE - 1);
        }        

        public Integer next() {

            // Record a value of an even index of the array
            Integer retValue = Integer.valueOf(arrayOfInts[nextIndex]);

            // Get the next even element
            nextIndex += 2;
            return retValue;
        }
        public void setNextIndex(int i){
            nextIndex=i;
        }
    }
    public void print(DataStructureIterator iterator) {

    // Print out values of odd indices of the array
    //iterator = this.new EvenIterator();
        iterator.setNextIndex(1);//**This line giving me compiler error that setNextIndex is undefined for type DataStructure.DataStructureIterator **
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println();
    }

    public EvenIterator createNewObject(){
        return this.new EvenIterator();
    }


    public static void main(String s[]) {

        // Fill the array with integer values and print out only
        // values of even indices
        DataStructure ds = new DataStructure();
        System.out.println("Even Index");
        ds.printEven();
        System.out.println("Odd Index");
        ds.print(ds.createNewObject());

    }
}

我将 EvenIterator 对象传递给方法 print(DataStructureIterator),据我所知,迭代器可以引用 EvenIterator 对象(因为 DataStructureIterator 是由 EvenIterator 实现的),尽管 hasNext() 和 setNextIndex(int) 是在同一个类中,引用迭代器只能访问 hasNext。

我该如何修复这个错误?

【问题讨论】:

  • 可以分享一下DataStructureIterator接口吗?

标签: java inner-classes


【解决方案1】:

即使您将EvenIterator 传递给print(DataStructureIterator) 方法,它也会默默地转换为DataStructureIterator。所以如果setNextIndex(int)方法没有在DataStructureIterator中声明,你将无法访问它。

【讨论】:

    【解决方案2】:

    print 方法知道它的参数是DataStructureIterator。方法setNextIndex 是否在该接口中声明?如果没有,您必须添加它。

    【讨论】:

    • 既然DataStructureIterator持有对象EvenIterator应该可以访问setNextIndex了吧?
    • 但是编译器不知道这一点。它只看到方法(可以用另一个不提供方法的 DataStructureIterator 调用)。要么在接口中声明方法(首选),要么在 print 中进行显式转换。