我有以下代码
public class SBag<Item> implements BagInterface<Item>, Iterable<Item> {
当我尝试编译时,我得到了
SBag.java:12: error: SBag is not abstract and does not override abstract method
iterator() in Iterable
public class SBag<Item> implements BagInterface<Item>, Iterable<Item>{
^
where Item is a type-variable:
Item extends Object declared in class SBag
我的任务是在不使用内部迭代器类的情况下实现Iterable,但我不确定如何执行此操作,因为我在编译时遇到了这个错误。我有以下方法add(),isFull(),toArray(),isEmpty(),getCurrentSize(),remove(),clear()和toString()。总体目标是能够使用for-each循环,但我不确定如何从这里继续。
答案 0 :(得分:2)
作为内部类的迭代器看起来像这样:
class MyIterable implements Iterable {
public Iterator iterator() {
return new Iterator() {
public boolean hasNext() {...}
public Object next() {...}
void remove();
}
}
}
相比之下,不是内部类的迭代器可能看起来更像:
class MyIterable implements Iterable {
public Iterator iterator() {
return new MyIterator();
}
}
class MyIterator {
public boolean hasNext() {...}
public Object next() {...}
void remove();
}
这是从技术上说而不是内心阶级的另一种方式,但如果你这样说,有些人会看着你很有趣:
class MyIterable implements Iterable {
public Iterator iterator() {
return new MyIterator();
}
static class MyIterator {
public boolean hasNext() {...}
public Object next() {...}
void remove();
}
}
答案 1 :(得分:1)
当您实施Iterable时,您可以将用于:每个循环语法:
实现此接口允许对象成为目标 “foreach”声明。
Iterable是通用接口,您应该实现它包含的方法:
public class MyIterable<E> implements Iterable<E>{
public Iterator<E> iterator() { // <--- Implement me!
return new CustomIterator<E>();
}
}
然后,例如,您可以执行以下操作:
public class CustomIterator<T> implements Iterator<T> {
public boolean hasNext() {
//...
}
public T next() {
//...
}
public void remove() {
//...
}
}
答案 2 :(得分:0)
虽然[此答案]提供了Iterable
实现的常规语法,但Iterator
在没有Iterable
实现类的情况下非常有用。例如:
public class DoesntIterate{
public void coolMethod(){
//Do stuff
Iterator iter = getMyIterator();
while(iter.hasNext()){
//Do stuff with iter.next()
}
}
private Iterator getMyIterator(){
return new MyIterator();
}
private class MyIterator implements Iterator{
...
}
}
通过这种范例,可以想象您可以在同一个类中使用不同的迭代器用于不同的目的。
从OOP的角度来看,你永远不应该创建一个类implement Iterable
,因为它不适合你将要迭代的类(即该类不是数据/存储结构。)