为实现类提供类型参数的正确方法

时间:2014-01-17 01:40:41

标签: java generics

我正在尝试为某些层次结构构建某种基类。我希望开发人员能够拥有自己的实现,而无需重复分层内容。

这是我的简化示例:

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类型。

在抽象类中推断实现类型的正确方法是什么?

0 个答案:

没有答案