1

我有一个实现 Iterable 的类,但有自己的hasNext()next()这样的方法:

public class BLMovie implements Iterable<BLMovieFrame> {

@Override
public Iterator<BLMovieFrame> iterator() {
    iteratorVar = 0;
    return liste.iterator();
}

public boolean hasNext() {
    if (loop)
        return true;
    return iteratorVar < liste.size();
}

public BLMovieFrame next() {
    iteratorVar = (iteratorVar++)%(liste.size()-1);
    return liste.get(iteratorVar);
}

public void remove() {
    throw new UnsupportedOperationException();
}

我很确定这不是最好的方法,
关于 Iterable 的其他线程似乎并不关心自己的下一个方法,所以有人对我有建议吗?

4

2 回答 2

5

您的方法是在错误的类上定义的。和方法需要在实现上定义hasNextnext而不是在. 如果您在每个方法上放置了@Override 注释,编译器就会通知您这个错误。removeIteratorIterable

事实上,您可以:

  • 为您的迭代器创建一个匿名内部类,并将这些方法移动到它的主体中
  • 为迭代器创建一个独立的类,并再次将这些方法移入其中

请注意,当您这样做时,您将不再能够利用嵌入列表的迭代器,但您将有效地定义自己的迭代器(当然,您可以将其包裹起来)。

于 2013-04-07T15:17:36.980 回答
3

实际上,您不会处理迭代器方法,因为您实际上是在返回 object 的迭代器liste

如果要实现自己的迭代器,最好的方法是创建一个匿名内部类。

    @Override
        public Iterator<BLMovieFrame> iterator() {
            // TODO Auto-generated method stub      
            return new Iterator <BLMovieFrame> (){

                @Override
                public boolean hasNext() {
                   if (loop)
                         return true;
                   return iteratorVar < liste.size();
              }

                @Override
                public BLMovieFrame next() {
                         iteratorVar = (iteratorVar++)%(liste.size()-1);
              return liste.get(iteratorVar);
              }
             @Override
            public void remove() {
                     throw new UnsupportedOperationException();
             }              
            };
于 2013-04-07T15:22:20.323 回答