我正在写一个通用类:
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>
。
有没有解决这个问题?
答案 0 :(得分:1)
将列表声明为:
List<Node<T>> children
您仍然可以在列表中放置子类的实例。
如果将其保留为未知类型,则编译器无法确保将其键入的类。例如,它可能被输入为SubClassA,但是你要添加SubClassB,它无法知道基于声明的类型,这是编译器必须继续进行的。在运行时,虽然列表和子类型可能匹配,但编译器无法断言。