Java中的通用通配符

时间:2013-09-22 00:55:20

标签: java generics

我正在写一个通用类:

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

我想要一些其他类来继承这个Node。此代码无法使用行parent.getChildren().add(this);上的错误进行编译。因为我使用List<? extends Node<T>>作为返回类型声明了getChildren(),并且'this'是类型Node<T>

有没有解决这个问题?

1 个答案:

答案 0 :(得分:1)

将列表声明为:

List<Node<T>> children

您仍然可以在列表中放置子类的实例。

如果将其保留为未知类型,则编译器无法确保将其键入的类。例如,它可能被输入为SubClassA,但是你要添加SubClassB,它无法知道基于声明的类型,这是编译器必须继续进行的。在运行时,虽然列表和子类型可能匹配,但编译器无法断言。