繁体   English   中英

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

[英]Can I extend Iterator to allow access to encapsulated inner class fields?

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

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

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

next()hasNext()方法可以很好地工作,根据我实例化名称还是位置迭代器来提供自定义结果。

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

但这不起作用。 当我从客户端调用itr.getName()时,我得到“找不到符号”。 我看到的最接近的答案是在这里,但我仍然得到“找不到符号”。

这是我的代码的摘要:

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
    }

对不起,很长的问题。 这是我第一次来,我仍然在弄清楚我的问题到底是什么。

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() );
    } 

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

简短回顾您的问题:

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

我应用了两个修复程序-在客户端代码中将itr声明为NameIterator; 调用nameIterator()时返回一个NameIterator。 叹。 现在,“找不到符号”已移至指向NameIterator itr声明。

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

MyList.NameIterator itr = myList.nameIterator();

或导入此类:

import your.package.MyList.NameIterator;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM