2013-09-22 33 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