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