2014-07-23 139 views
0

我正在實施Trie數據結構。當我使用外部類引用時,在Eclipse IDE中出現以下錯誤。當訪問外部類參考時,java內部類出錯

的方法比較(捕獲#1-的?超級E,捕獲#1-的?超級E)在 的類型比較是不適用的 參數(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;   
     } 
    } 
} 

如何解決?

Error displaying in Eclipse

+0

雅,試過了,「在類型比較的方法比較(E,E)是不適用的參數(E,E)」得到這個錯誤 – Nageswaran

+1

能否請您發表您的代碼,而不是圖像?這樣人們可以嘗試儘快給你一個解決方案。你想讓你的比較器像'私人比較器比較器? ' –

+1

你的內部類中的'E'和你的外部類中的'E'不一樣;他們指的是不同的無關類型。同時將您的代碼作爲代碼發佈,而不是截圖;因此人們可以在答案中更正您的代碼(他們不打算再次輸入) –

回答

2

您省去在帖子中一個重要的警告:The type parameter E is hiding the type E就行了private class Entry<E>

有類型參數E之間在內部類Entry和一個在外部類Trie無關。您可以在Entry中將E更改爲F,您將得到完全相同的錯誤。

但是如果你不重新定義<E>類聲明Entry它會工作,因爲內部類可以訪問外部類的類型參數(最初我忘了)

你需要什麼是這樣的:Entry代替每個出現的Entry<E>

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

這會讓你的問題消失。

+0

它的工作,謝謝... :) – Nageswaran