2013-09-22 75 views
2

我正在寫一個通用類:通用通配符在Java中

public class Node<T> { 
    private Node<T> parent = null; 
    private List<? extends Node<T>> children = null; 

    public Node<T> getParent() { 
     return parent; 
    } 

    public void setParent(Node<T> parent) { 
     if(this.parent != null){ 
      // Remove current parent's children references 
      this.parent.getChildren().remove(this); 
     } 

     // Add references 
     this.parent = parent; 
     parent.getChildren().add(this); 
    } 

    public List<? extends Node<T>> getChildren() { 
     return children; 
    } 
} 

我想其中此類子節點的一些其他類。此代碼無法通過parent.getChildren().add(this);上的錯誤進行編譯。因爲我用List<? extends Node<T>>作爲返回類型聲明瞭getChildren(),而'this'是Node<T>

有沒有辦法解決這個問題?

+0

http://stackoverflow.com/questions/1292109/generics-get-andput-rule –

回答

1

聲明列表如下:

List<Node<T>> children 

您仍可以把子類的實例在列表中。

如果您將它作爲未知類型保留,編譯器無法確保將其鍵入爲哪個類。例如,它可能被輸入爲SubClassA,但是您添加了SubClassB,並且無法根據聲明的類型知道,這是編譯器必須繼續執行的。在運行時,儘管list和child的類型可能匹配,但編譯器不能斷言。

+0

將'children'的聲明更改爲List >是一種方式,但實際上我需要運行一些指定的子類方法,如:children.get(0).encode(「abcdaaaa」)。如果我改變了宣言,我必須投下它,我認爲這不是一個好方法。 :-) –

+0

我不認爲有解決方法 – Bohemian