Iterable和Iterators - 编译错误

时间:2013-05-15 14:36:33

标签: java compiler-errors iterable

我有以下界面:

public interface DataSet<T> extends Iterable<T>  {
  public int nExamples();
  public T getExample(int index);
  public Iterator<T> iterator();
}

然后是实现此接口的类:

public class StringTupleDataset implements DataSet<StringTuple> {
Vector<StringTuple> examples;

public StringTupleDataset(Vector<StringTuple> examples) {
    if(examples == null) 
        throw new IllegalArgumentException("null parameter: examples");
    this.examples = examples;
} // constructor

@Override
public int nExamples() {
    return examples.size();
} // nExamples

@Override
public StringTuple getExample(int index) {
    return examples.get(index);
} // getExample

@Override
public Iterator<StringTuple> iterator() {
    return examples.iterator();
} // getAllExamples
} // class

StringTupleDataset编译没有问题。

然而,当我尝试在另一个类中编写这段代码时:

public abstract class AbstractOntologyFiller<T> {
private AbstractOntologyFiller() {}

public static <T> void fill(OntologyManager ontoManager, DataSet<T> dataset) {
     for(T e : dataset.iterator()) {
          // do something
     } // for
  } // fill  
} // class

我有一个编译错误说:

Can only interate over an array or an instance of java.lang.Iterable

有没有人可以帮助我?

3 个答案:

答案 0 :(得分:4)

您不能迭代Iterator,但可以遍历Iterable

for(T e : dataset)

就足够了,因为Dataset延伸Iterable,而dataset.iterator则为Iterator

答案 1 :(得分:1)

您只需要迭代dataset而不是dataset.iterator()

说明:for循环期待Iterable。 Iterable不是迭代器:它是对象上有iterator()方法。

答案 2 :(得分:0)

好的,得到了​​错误。

我应该写:

public static <T> void fill(OntologyManager ontoManager, DataSet<T> dataset) {
    for(T e : dataset) { // (without .iterator()