我可以扩展Iterator以允许访问封装的内部类字段吗?

时间:2015-06-13 00:38:14

标签: java iterator abstract-class inner-classes extends

我很沮丧,试图将方法添加到自定义迭代器。

对于我的第二季度Java类中的作业,我们应该从头开始实现链接列表。没问题:我创建了一个外部类来实现链表和一个静态私有内部类来实现各个节点,封装它们,隐藏在任何客户端程序中。

此链接列表中的节点将具有两个不同的下一个字段(一个用于名称,另一个用于场所)。接下来的一个字段将带我通过一条路径通过所有节点;跟随另一个下一个领域将带我另一条路线。 (根据名称或地点,考虑两个不同的字母顺序。)没问题:迭代节点,遵循名称或跟随地点,我创建了两个自定义迭代器。一个抽象类实现Iterator< Node >和公共代码,两个内部类通过nextName字段或nextPlace字段为每个迭代器实现自定义代码。

next()hasNext()方法工作得很漂亮,根据我是否实例化了名称或地点迭代器,提供了自定义结果。

这些节点还包含我想要打印到控制台并保存在文件中的数据。节点被故意封装在列表类中,以保护它们免受客户端程序的恶意使用。我想通过添加访问器方法来扩展我的迭代器,例如getName()getPlace()方法。这就是我采取额外步骤创建抽象类的原因,而不是让我的自定义迭代器直接实现Iterator

但它不起作用。当我从客户端拨打itr.getName()时,我收到“无法找到符号”。我见过的最接近的答案是here,但我仍然“找不到符号。”

以下是我的代码概要:

import java.util.Iterator;

public class MyList implements Iterable {

    // ...

    public Iterator nameIterator() {
        return new NameIterator( this );
    }

    public Iterator placeIterator() {
        return new placeIterator( this );
    }

    public abstract class NodeIterator implements Iterator< Node > {

        public NodeIterator( MyList list ) { ... }

        public boolean hasNext() { ... } // this appears to work fine

        public String getName() { ... } // this can't be seen by the client

        public String getPlace() { ... } // this can't be seen by the client

    }

    private class NameIterator extends NodeIterator {

        public NameIterator( MyList list ) {
            super( list );
            ...
        }

        public Node next() { ... }

    }

    private class PlaceIterator extends NodeIterator { ... } // same as NameIterator with custom code

    private static class AttractionNode {
        public String  name;
        public String  place;

        public Node  nextName;
        public Node  nextPlace;

        // ...
    }
}

我希望客户端代码能够运行:

    System.out.println( "\nBy names: " );
    Iterator itr = placesToGo.nameIterator();
    while( itr.hasNext() ) {
        itr.next();
        System.out.println( itr.getName() ); // gives me "cannot find symbol" error
        // System.out.println( itr.next() ); // works fine, alone
    }

很抱歉这个问题很长。这是我的第一次,我还在弄清楚我的问题到底是什么。

2 个答案:

答案 0 :(得分:0)

nameIterator()必须返回NameIterator而不是Iterator<Node>

public NameIterator nameIterator() {
    return new NameIterator( this );
}

客户端代码必须使用NameIterator代替Iterator<Node>

    System.out.println( "\nBy names: " );
    NameIterator itr = placesToGo.nameIterator();
    while( itr.hasNext() ) {
        itr.next();
        System.out.println( itr.getName() );
    } 

答案 1 :(得分:0)

在阅读评论中的讨论后,我建议您使用可以帮助您解决编译错误的IDE,例如Intellij IDEA

对您的问题进行简短回顾:

如前所述,返回自定义迭代器的List方法必须具有类似NameIteratorPlaceIterator的具体返回类型。

  

我应用了两个修复程序 - 在客户端中将itr声明为NameIterator   码;调用nameIterator()时返回NameIterator。叹。   现在&#34;找不到符号&#34;已经转移到指向NameIterator itr   声明。

看起来,编译器看不到你的内部NameIterator类。要使用外部类外部的内部类,还应指定外部类名:

MyList.NameIterator itr = myList.nameIterator();

或导入此类:

import your.package.MyList.NameIterator;