具有通用引用的树接口

Mar*_*tin 1 java generics tree interface

我有一个我们已实现的树的问题,这是一个示例:

public interface TreeNode {
    TreeNode getParent();
    void setParent(TreeNode parent);

    List<TreeNode> getChildren();
    void setChildren(List<TreeNode> children);
}
Run Code Online (Sandbox Code Playgroud)

所以,到现在为止这很容易,但是我们有一些Tree的变体,所以我们有一些这样的接口:

public interface TreeNodeWithX extends TreeNode {
    String getX();
    void setX(String x);
}

public interface TreeNodeWithY extends TreeNode {
    Boolean getY();
    void setY(Boolean y);
}
Run Code Online (Sandbox Code Playgroud)

因此,我需要一个TreeNodeWithX对象(是的,它的实现)从其getParent方法返回一个TreeNodeWithX对象(对于TreeNode接口中的其他方法也是如此).

来自TreeNodeWithY的相同行为,getParent()应返回TreeNodeWithY.

我尝试过一些泛型方法,例如:

public interface TreeNode<T extends TreeNode> {
    T getParent();
    void setParent(T parent);

    List<T> getChildren();
    void setChildren(List<T> children);
}
Run Code Online (Sandbox Code Playgroud)

但是,在实施方法的某些时候,我总是遇到麻烦.我的问题是,我是否使用我的通用界面正确的方式或我在这里做错了什么?

这种递归泛型引用并没有真正帮助我...

Lui*_*oza 6

您希望您的节点处理通用数据,而不是只生成TreeNode要保留的通用数据.IMO你的界面应该T用来处理数据并保留其他方法:

public interface TreeNode<T> {
    TreeNode<T> getParent();
    void setParent(TreeNode<T> parent);

    List<TreeNode<T>> getChildren();
    void setChildren(List<TreeNode<T>> children);

    T getData();
    void setData(T data);
}
Run Code Online (Sandbox Code Playgroud)

现在你可以有TreeNode<String>TreeNode<Boolean>getData方法将返回一个String或一个Boolean(上传递的通用类参数取决于).

TreeNode<String> treeNode = new SomeImplementationOfTreeNode<String>();
treeNode.setData("Hello world");
System.out.println(treeNode.getData()); // "Hello world"
Run Code Online (Sandbox Code Playgroud)