我想知道是否有办法扩展迭代器接口的功能。假设我们有一个实现Iterable接口的Class(在上面的例子中,我没有添加myFunction的Iterator接口的重写函数)。
public class MyClass implements Iterable{
@Override
public Iterator iterator() {
return new Iterator() {
@Override
public boolean hasNext() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Tuple next() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}
public void myFunction(){
}
};
}
}
如果我将此代码放在另一个函数中,我会收到编译错误(“找不到符号”),我想知道为什么会这样。
public void anotherFunction(){
MyClass a = new MyClass();
a.iterator().myFunction();
}
答案 0 :(得分:9)
是的,当然。您可以创建另一个界面:
interface MyBetterIterator extends Iterator
{
void myFunction();
}
然后让方法返回你的类型:
public class MyClass implements Iterable{
@Override
public MyBetterIterator iterator() {
...
}
}
该功能称为“返回类型协方差”,在Java 5中引入。
答案 1 :(得分:1)
即使您已将自己的函数添加到Iterator
实例,但您告诉所有使用您的类的类的是您返回Iterator
。这意味着您仅限于Iterator
接口公开的签名。如果要访问myFunction,则必须正式声明扩展Iterator
的自己的接口,然后使iterator()
函数返回。但是,这也会破坏Iterable
合约,因此您必须做出选择。
答案 2 :(得分:0)
您的myFunction()
不属于Iterator
接口,因此无法在使用Iterator
类型声明的对象上使用。
a.iterator().myFunction();
^
Returns an Iterator and therefore gives a compilation error