我有以下界面:
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
有没有人可以帮助我?
答案 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()