2010-04-25 5 views
1

У меня есть следующий кодРеализация Iterable в Java

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(){ 
       ... 
      } 
}; 

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

спасибо.

+3

Это должно быть 'реализует Iterable'. – SLaks

ответ

11

Вам не нужно.

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

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

1

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

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' 
     } 
     }  
    } 

} 
+0

Неправильно. Он хочет внешнего «этого». – SLaks

+2

То, как это указано, является внешним «этим». Если вы находитесь в методе iterator(), и вы запрашиваете «this» (как я писал), он ссылается на объект, для которого iterator() является методом. Поэтому «a» относится к объекту типа «A». – rmarimon

1

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

A a = A.this 
Смежные вопросы