1

我对我们实施的树有疑问,这是一个示例:

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

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

所以,到目前为止这很容易,但是我们有一些树的变体,所以我们有一些像这样的接口:

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

public interface TreeNodeWithY extends TreeNode {
    Boolean getY();
    void setY(Boolean y);
}

所以,我需要一个 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);
}

但是,在方法的实施中,我总是在某些时候遇到麻烦。我的问题是,我的通用接口是否正确,或者我在这里做错了什么?

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

4

3 回答 3

6

您希望您的节点处理通用数据,而不是只生成通用TreeNodes 来保存。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);
}

现在您可以拥有TreeNode<String>以及TreeNode<Boolean>哪个getData方法将返回 aString或 a Boolean(取决于传递的泛型类参数)。

TreeNode<String> treeNode = new SomeImplementationOfTreeNode<String>();
treeNode.setData("Hello world");
System.out.println(treeNode.getData()); // "Hello world"
于 2013-06-27T14:33:23.060 回答
4

的类型TreeNode应该是每个节点持有的的类型,而不是类型TreeNode(我们已经知道我们正在处理TreeNodes

试试这个:

/**
 * A Node in a Tree
 * @param <T> The type of the value held at each node
 */
public interface TreeNode<T> {
    TreeNode<T> getParent();
    void setParent(TreeNode<T> parent);

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

    // A getter/setter of type `T` to the node for the "value" held there.
    T getValue();
    void setValue(T value);
}

考虑省略 setter 并final在实现中创建字段,将值传递给构造函数:

// Impl if TreeNode doesn't declare a setValue() method
public class MyTreeNode<T> implements TreeNode<T> {
    final T value;
    public MyTreeNode(T value) {
        this.value = value;
    }
    // rest of impl
}

TreeNode如果您只考虑一个实现,也可以考虑创建一个类。

于 2013-06-27T14:33:31.597 回答
2

TreeNode<T extends TreeNode>不是正确的方法。如何使用单个接口:

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

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

    T getValue();
    void setValue(T x);
}
于 2013-06-27T14:33:19.373 回答