我正在尝试为某些层次结构构建某种基类。我希望开发人员能够拥有自己的实现,而无需重复分层内容。
这是我的简化示例:
interface Node<N extends Node> {
N getParent();
List<N> getChildren();
void addChild(N child);
void traverse(NodeTraverser<N> traverser);
}
abstract class AbstractNode<N extends AbstractNode> implements Node<N> {
private N parent;
private List<N> children;
@Override
public N getParent() { return parent; }
@Override
public List<N> getChildren() { return children; }
@Override
public void addChild(N child) {
child.setParent(this); // ** Problem Here **
this.children.add(child);
}
@Override
public void traverse(NodeTraverser<N> traverser) {
traverser.visit(this); // ** Problem Here **
for(N child: children) {
child.traverse(traverser);
}
}
}
我将N
作为类型参数的原因是,我希望具体类Node
能够使用具体类的实际类型(例如,返回时{{1} } {},parent
也可以对付实际的实现。所以impl看起来像这样:
NodeTraverser
但是我在源代码中标记的class Employee extends AbstractNode<Employee> {
//... some Employee specific methods
}
// traverse will look like:
employee.traverse( new NodeTraverser<Employee>() {
@Override
public void visit(Employee employee) {
System.out.println("employee name " + employee.getName()
+ " and parent " + employee.getParent().getName());
}
}
存在问题。因为它的类型为AbstractNode
,并且它不符合AbstractNode
,这使得编译失败。我的解决方法是在N
AbstractNode
中创建一个新的受保护方法,并将protected N thisNode() { return (N) this; }
的访问权限替换为this
。它有效,但它看起来很难看,因为不安全的转换和无法避免传递类型不是实际的impl类型。
在抽象类中推断实现类型的正确方法是什么?