2

我正在写一个通用类:

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);。因为我将 getChildren() 声明List<? extends Node<T>>为返回类型,而 'this' 是 type Node<T>

有没有办法解决这个问题?

4

1 回答 1

1

将列表声明为:

List<Node<T>> children

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

如果您将其保留为未知类型,编译器将无法确定它被键入为哪个类。例如,它可能被键入为 SubClassA,但您正在添加 SubClassB,它无法根据声明的类型知道,这是编译器必须继续进行的所有工作。在运行时,虽然 list 和 child 的类型可能匹配,但编译器无法断言。

于 2013-09-22T01:02:15.327 回答