Java-Iterable拥有自己的hasNext()和next():如何正确操作?

Java-Iterable拥有自己的hasNext()和next():如何正确操作?,java,iterator,iterable,Java,Iterator,Iterable,我有一个实现Iterable的类,但有自己的hasNext()和next()方法,如下所示: public class BLMovie implements Iterable<BLMovieFrame> { @Override public Iterator<BLMovieFrame> iterator() { iteratorVar = 0; return liste.iterator(); } public boolean hasNext() {

我有一个实现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();
}
public类BLMovie实现了Iterable{
@凌驾
公共迭代器迭代器(){
迭代器var=0;
返回liste.iterator();
}
公共布尔hasNext(){
如果(循环)
返回true;
返回iteratorVar
我很确定这不是最好的方法,

关于Iterable的其他线程似乎并不关心自己的next方法,那么有人能给我一个建议吗?

您的方法在错误的类上定义。
hasNext
next
remove
方法需要在
迭代器
实现上定义,而不是在
Iterable
。如果您在每个方法上都放置了@Override注释,编译器就会通知您此错误

实际上,您可以:

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

请注意,当您这样做时,您将无法再利用嵌入列表的迭代器,但您将有效地定义自己的迭代器(当然,您可以将其结束).

您的方法在错误的类上定义。
hasNext
next
remove
方法需要在
迭代器
实现上定义,而不是在
Iterable
上定义。如果您在每个方法上都放置了@Override注释,编译器会通知您这个错误

实际上,您可以:

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

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

实际上,您不会处理迭代器方法,因为您实际返回的是对象的迭代器
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();
             }              
            };
@覆盖
公共迭代器迭代器(){
//TODO自动生成的方法存根
返回新的迭代器(){
@凌驾
公共布尔hasNext(){
如果(循环)
返回true;
返回iteratorVar
实际上,您不会处理迭代器方法,因为您实际上返回的是对象的迭代器
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();
             }              
            };
@覆盖
公共迭代器迭代器(){
//TODO自动生成的方法存根
返回新的迭代器(){
@凌驾
公共布尔hasNext(){
如果(循环)
返回true;
返回iteratorVar
你真的需要重写hasnext()和next()方法吗?@TheEwook是的,因为循环-attribute@TheEwook抱歉,有点晚了,但我只是想了想:既然我必须在iterator()中定义一个新的迭代器,我怎么能不重写这些方法呢无论如何?我只想把它们放在一个内部类中。你真的需要重写hasnext()和next()方法吗?@TheEwook是的,因为循环-attribute@TheEwook抱歉,有点晚了,但我只是想了想:既然我必须在iterator()中定义一个新的迭代器,我怎么能不重写这些方法呢总之,我会把它们放在一个内部类中,你的意思是制作一个自己的迭代器,比如BLMovieIterator,然后在迭代器()中返回一个新的对象method?@Big_Chair-是的,这就是我的意思。迭代器类不需要实现为匿名内部类。您也可以选择将其实现为BLMOvie的成员类,即内部类或静态嵌套类。Java教程中有一个将其实现为内部类的示例(虽然没有Iterable接口):啊,你的意思是创建一个自己的迭代器,比如BLMovieIterator,然后在迭代器()中返回这个迭代器的新对象method?@Big_Chair-是的,这就是我的意思。迭代器类不需要实现为匿名内部类。您也可以选择将其实现为BLMOvie的成员类,即内部类或静态嵌套类。Java教程中有一个将其实现为内部类的示例(虽然没有Iterable接口):它有什么好处呢?
%(liste.size()-1)
如果有索引超出范围,我们不应该抛出吗