2010-04-25 6 views
1

J'ai le code suivantImplémentation Iterable en 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(){ 
       ... 
      } 
}; 

Je voudrais initialiser le champ « a » dans la classe anonyme avec l'instance de A cette méthode iterator a été appelé. C'est possible?

Merci.

+3

Cela devrait être 'A Iterable' met en œuvre. – SLaks

Répondre

11

Vous n'en avez pas besoin.

Vous pouvez appeler des méthodes sur la classe externe normalement dans la classe interne.
Lorsque vous le compilez, le compilateur génère automatiquement un champ caché qui contient une référence à la classe externe.

Pour référencer vous-même cette variable, vous pouvez écrire A.this. (A.this est le champ généré par le compilateur et est équivalent à votre champ a)

1

Essayez ceci:

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

Mauvais. Il veut l'extérieur «ceci». – SLaks

+2

La façon dont il est indiqué est le 'ceci' extérieur. Si vous êtes dans la méthode iterator() et que vous demandez 'this' (comme je l'ai écrit), cela fait référence à l'objet dont iterator() est une méthode. Donc 'a' fait référence à un objet de type 'A'. – rmarimon

1

Utilisation:

A a = A.this