2013-05-15 3 views
0

У меня есть следующий интерфейс: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 

ли кто-нибудь может мне помочь?

ответ

4

Вы не можете перебирать Iterator, но вы можете перебирать Iterable.

for(T e : dataset) 

будет достаточно, так как Dataset расширяет Iterable, в то время как dataset.iterator дает вам Iterator.

1

Вам просто нужно перебрать dataset вместо dataset.iterator()

Объяснение: петля for ожидает итератора. Iterable не является итератором: это объект, на котором есть метод iterator().

0

Хорошо, получена ошибка.

я должен был бы написать:

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