2014-07-23 2 views
0

Je suis en train de mettre en œuvre la structure de données Trie. Lorsque j'utilise la référence de classe externe, j'obtiens l'erreur ci-dessous dans Eclipse IDE.Erreur avec la classe interne java lors de l'accès à la référence de classe externe

La méthode de comparaison (capture # 1 de? Super E, la capture # 1 de? Super E) le type de comparaison est pas applicable pour les arguments (E, E)

public class Trie<E> implements Collection<E> { 

    private Comparator<? super E> comparator; 

    private class Entry<E> {   
     private Entry<E> parent; 
     private Set<Entry<E>> children; 

     private E data; 

     Entry(Entry<E> parent, E data){ 
      this.parent = parent; 
      this.data = data; 

      parent.addChild(this); 
     } 

     boolean addChild(Entry<E> child){ 
      if (children == null) 
       children = new TreeSet<Entry<E>>(
         new Comparator<Entry<E>>() {        
          public int compare(Entry<E> o1, Entry<E> o2) { 
           return Trie.this.comparator.compare(o1.data, o2.data); 
          }; 
         } 
         ); 

      return children.add(child); 
     } 

     boolean removeChild(Entry<E> child){ 
      boolean result = false; 
      if (children != null && children.contains(child)) { 
       result = children.remove(child); 

       if (children.size() == 0) 
        children = null; 
      } 

      return result;   
     } 
    } 
} 

Comment résoudre?

Error displaying in Eclipse

+0

Ya, a essayé, obtenir cette erreur "La méthode de comparaison (E, E) dans le type n'est pas Comparator applicable pour les arguments (E, E)" – Nageswaran

+1

pouvez-vous s'il vous plaît envoyer votre code au lieu de l'image? Alors que les gens peuvent essayer et vous donner une solution dès que possible. Et vous voulez votre comparateur comme 'comparateur privé comparateur? ' –

+1

Le' E' dans votre ombre de classe interne (n'est pas le même que) le 'E' dans votre classe externe; ils se réfèrent à différents types non liés. Publiez également votre code en tant que code, pas en tant que capture d'écran; donc les gens peuvent corriger votre code dans une réponse (ils ne vont pas le taper à nouveau) –

Répondre

2

Vous avez omis un avertissement crucial dans votre message: The type parameter E is hiding the type E sur la ligne private class Entry<E>.

Il n'y a pas de relation entre le paramètre de type E en classe interne Entry et celui de la classe externe Trie. Vous pouvez changer E en F en Entry et vous obtiendrez exactement la même erreur.

Toutefois, si vous ne redéfinissez <E> dans la déclaration de classe Entry il fonctionnera parce que la classe interne a accès au paramètre de type de la classe externe (d'abord j'oubliais que)

Ce que vous devez faire est: remplacer chaque occurrence de Entry<E> avec juste Entry.

public class Trie<E> implements Collection<E> { 

    private Comparator<? super E> comparator; 

    private class Entry { 
     private Entry parent; 
     private Set<Entry> children; 

     private E data; 

     Entry(Entry parent, E data) { 
      this.parent = parent; 
      this.data = data; 

      parent.addChild(this); 
     } 

     boolean addChild(Entry child) { 
      if (children == null) 
       children = new TreeSet<Entry>(new Comparator<Entry>() { 
        public int compare(Entry o1, Entry o2) { 
         return Trie.this.comparator.compare(o1.data, o2.data); 
        }; 
       }); 

      return children.add(child); 
     } 

     boolean removeChild(Entry child) { 
      boolean result = false; 
      if (children != null && children.contains(child)) { 
       result = children.remove(child); 
       if (children.size() == 0) 
        children = null; 
      } 
      return result; 
     } 
    } 
} 

Cela fera disparaître votre problème.

+0

Ça a marché, merci ... :) – Nageswaran

Questions connexes