2011-05-19 76 views
3

用下面的代碼,我得到一個編譯錯誤「不兼容的類型 - 找到Tree<T>但預計Tree<T>」。任何想法我在做什麼用泛型錯了?除ParentObjectClass.this之外的任何其他方式訪問對象的父對象?我意識到「解決方法」,比如向指向其父對象的Node類添加一個變量。另外,我可以將myInt作爲構造函數參數傳遞,但我希望找到更好的解決方案。感謝您的任何建議。Java - 訪問對象的父對象,涉及泛型?

我在這個網站上遇到了類似的問題,但我試了一下我的代碼,並無法使其工作:Access "this" from Java anonymous class

public class Tree<T> implements TreeIF<T> { 
    private int myInt; 
    Node<T> root; 

    ... 

    // a constructor 
    public Tree(Node<T> root) { 
     this(root.getTree().getMyInt()); // call to different constructor 
     this.root = root; 
    } 

    ... 

    // a method 
    public int getMyInt() { 
     return myInt; 
    } 

    ... 

    // inner class 
    class Node<T> { 
     T element; 

     ... 

     Tree<T> getTree() { 
      // return Tree.this;  // I tried this too, but it didn't work 
      **return Tree<T>.this;** // HERE'S THE COMPILE ERROR 
     } 
    } 
} 

感謝您的建議,喬恩。而且,是的,你說得對,Tree類的T與Node類相同。樹實際上包含節點,節點包含元素。 Tree類已經知道它使用Node類,所以不需要類型參數。類型參數基本上是一個傳遞。我只是完全擺脫了Tree的類型參數,但是接口(我不能修改)在它的幾個方法中返回T,所以它需要知道T是什麼。我嘗試改變爲E並編譯......我沒有得到同樣的錯誤,但是,我在另一部分中遇到了錯誤。我必須找出其他錯誤,然後看看會發生什麼。同時,還有什麼進一步的建議?

回答

5

你已經引入了一個新類型的參數,也稱爲T.如果更改此:

class Node<T> 

這樣:

class Node<E> 

誤差會更清楚。不過,我懷疑你實際上想這樣的:

class Node 

畢竟,節點在T真的只有T樹的,對不對?換句話說,你想要一個(說)Tree<String>.Node - 這是沒有意義的有一個Tree<String>.Node<Object>

0

這工作:

public class Tree<T> { 
    private int myInt; 
    Node root; 

    ... 

    // a constructor 
    public Tree(Node root) { 
     this(root.getTree().getMyInt()); // call to different constructor 
     this.root = root; 
    } 

    ... 

    // a method 
    public int getMyInt() { 
     return myInt; 
    } 

    ... 

    // inner class 
    class Node { 
     T element; 

     Tree<T> getTree() { 
      return Tree.this; // leave out <T> 
     } 
    } 
}