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)
但是,在实施方法的某些时候,我总是遇到麻烦.我的问题是,我是否使用我的通用界面正确的方式或我在这里做错了什么?
这种递归泛型引用并没有真正帮助我...
您希望您的节点处理通用数据,而不是只生成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)