2017-06-22 2 views
0

J'étudie les classes Java et l'héritage et j'ai eu un doute avec les interfaces.Est-ce que LinkedList en Java a un itérateur par défaut implémenté?

La classe LinkedList implémente Serializable, Cloneable, Iterable, Collection, Deque, List, Queue selon la documentation Oracle.

Parce qu'Iterable est une interface et non une classe comme LinkedList, il doit avoir implémenté un itérateur par défaut, n'est-ce pas? Et si je comprends bien, où pourrais-je voir la mise en œuvre?

Répondre

1

La réponse courte est, dans le code source.

La réponse la plus longue est LinkedList elle-même n'a pas besoin d'implémenter la méthode iterator() si elle hérite d'une autre classe qui peut l'implémenter. Si vous regardez de plus près le javadoc for LinkedList, vous pouvez voir que LinkedList ne définit pas la méthode iterator(), mais que vous implémentez Iterable il devrait être là. En regardant la fin, vous pouvez également voir la section des méthodes héritées. Plus précisément, regardez "Méthodes héritées de la classe java.util.AbstractSequentialList", où iterator() est répertorié. Nous avons maintenant déterminé que iterator est en fait java.util.AbstractSequentialList. Donc, pour trouver la mise en œuvre, vous pouvez consulter le source code de AbstractSequentialList qui est:

public Iterator<E> iterator() { 
    return listIterator(); 
} 

Maintenant que vous voyez la mise en œuvre dépend de la mise en œuvre de listIterator(). LinkedList n'implémente pas la méthode listIterator() (il a un avec un argument mais cela attend la méthode sans argument). Donc, en regardant à nouveau le javadoc, nous pouvons trouver sous "Méthodes héritées de la classe java.util".. AbstractList » que la méthode listIterator() est héritée de là à la recherche donc à la source code de AbstractList:

public ListIterator<E> listIterator() { 
    return listIterator(0); 
} 

Maintenant, la méthode listIterator(int) est mis en œuvre dans la classe LinkedList De l'source code de LinkedList.

public ListIterator<E> [More ...] listIterator(int index) { 
    checkPositionIndex(index); 
    return new ListItr(index); 
} 

Si vous avez besoin d'analyser plus avant ce qui est fait, vous pouvez continuer à partir de là

+1

Je savais que vous pouviez implémenter votre propre itérateur (je l'ai fait pour un sujet à l'université, mais la classe n'était pas LinkedList), mais je n'étais pas du tout sûr d'une implémentation par défaut dans LinkedList, maintenant je suis – alberto

3

Parce que Iterable est une interface et non comme une classe LinkedList, il doit avoir mis en place un iterator par défaut, il mustn't?

pas vraiment, si la super-classe ne substituez la méthode alors la classe de l'enfant n'a pas à ...

oeil à ceci:

interface IFoo { 
    int getFoo(); 
} 

class A implements IFoo { 

    @Override 
    public int getFoo() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 

class B extends A { 
    // ... 
} 
class C extends A implements IFoo { 
    // ... 
} 

note comment c classe compile bien même thoe (redondante) met en œuvre IFoo mais ne marche pas overide la méthode getFoo (qui est seulement possible cos C extends A)


la classe ressemble à:

public class LinkedList<E> 
    extends AbstractSequentialList<E> 
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable 
{ 

donc dans la hiérarchie des classes, il ressemble à enter image description here

où le AbstractCollection ressemble:

public abstract class AbstractCollection<E> implements Collection<E> { 

donc il est là où ils ne remplacent les méthodes de interface Iterable<T>

+0

Eh bien, il n'est pas nécessaire d'implémenter la méthode beeing abstract. En fait, c'est 'AbstractSequentialList' qui implémente vraiment le' Iterator' à rediriger vers l'interface 'ListIterator' (implémentée dans AbstractList). – AxelH

0

Vous trouverez la mise en œuvre des méthodes d'interface itérable dans la classe Linked List lui-même.

+0

OK, mais peut-être que vous devriez inclure du code pour en faire une réponse de bonne foi. –

0

So LinkedList class extends Résumé Classe SequentialList. Cette classe a une méthode appelée itérateur. Puisque LinkedList étend la classe AbstractSequentialList, nous pouvons utiliser la méthode iterator.

public abstract class AbstractSequentialList<E> 
extends AbstractList<E>{ 
    public Iterator<E> iterator(){ 
    //implementation 
} 
} 

Maintenant, la classe LinkedList étend la classe AbstractSequentialList. donc en faisant l'objet de la classe LinkedList nous pouvons utiliser la méthode iterator.

public class LinkedList<E> 
extends AbstractSequentialList<E> 
implements List<E>, Deque<E>, Cloneable, Serializable{ 
}