Реализация Iterable в Java - PullRequest
       3

Реализация Iterable в Java

1 голос
/ 25 апреля 2010

У меня есть следующий код

public class A extends Iterable<Integer> {
    ...
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {

            A a;

            public boolean hasNext() {
                ...
            }

            public Integer next() {
                ...
            }

            public void remove(){
                ...
            } 
};

Я хотел бы инициализировать поле «a» в анонимном классе экземпляром A, к которому был вызван метод итератора. Возможно ли это?

Спасибо.

Ответы [ 3 ]

11 голосов
/ 25 апреля 2010

Вам не нужно.

Вы можете вызывать методы внешнего класса обычно внутри внутреннего класса.
Когда вы его скомпилируете, компилятор автоматически сгенерирует скрытое поле, содержащее ссылку на внешний класс.

Чтобы ссылаться на эту переменную самостоятельно, вы можете написать A.this. (A.this является сгенерированным компилятором полем и эквивалентно вашему a полю)

1 голос
/ 25 апреля 2010

Использование:

A a = A.this
1 голос
/ 25 апреля 2010

Попробуйте это:

public class A extends Iterable<Integer> {

  public Iterator<Integer> iterator() {

      final A a = this;

      return new Iterator<Integer>() {
        public boolean hasNext() {
            // here you can use 'a'
        }
      }      
  }

}
...