0

我有以下界面:

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

有谁能帮助我吗?

4

3 回答 3

4

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

for(T e : dataset)

就足够了,因为Datasetextends Iterable, whiledataset.iterator给你一个Iterator.

于 2013-05-15T14:38:06.533 回答
1

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

解释:for循环需要一个 Iterable。Iterable 不是迭代器:它是具有iterator()方法的对象。

于 2013-05-15T14:38:09.957 回答
0

好的,得到错误。

我应该写:

public static <T> void fill(OntologyManager ontoManager, DataSet<T> dataset) {
    for(T e : dataset) { // (without .iterator() 
于 2013-05-15T14:39:00.367 回答