[英]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
方法必须具有具体的返回类型,例如NameIterator
或PlaceIterator
。
我应用了两个修复程序-在客户端代码中将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.