Java 为实现类指定类型param的正确方法
我试图为某种层次结构构建某种基类。我希望开发人员能够拥有自己的实现,而无需重复层次结构 这是我的一个简化示例:Java 为实现类指定类型param的正确方法,java,generics,Java,Generics,我试图为某种层次结构构建某种基类。我希望开发人员能够拥有自己的实现,而无需重复层次结构 这是我的一个简化示例: interface Node<N extends Node> { N getParent(); List<N> getChildren(); void addChild(N child); void traverse(NodeTraverser<N> traverser); } abstract class Abst
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);
}
}
}
但是,正如我在源代码中标记的那样,AbstractNode存在一个问题。因为这是AbstractNode类型,并且它不符合N,这使得编译失败。我的解决方法是在AbstractNode中创建一个新的受保护方法,比如protectednthisnode{returnthis;},并替换我对thisNode的访问。它可以工作,但在我看来很难看,因为不安全的强制转换和无法避免传递不是实际impl类型的类型
推断抽象类中实现类型的正确方法应该是什么
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());
}
}