我是一个仿制药新手,我无法找到实现这一目标的最佳方法。如果我做了明显错误的事情,请随时指出。
interface Node<T> {
void addOne(Node<T> node);
}
class StringNode implements Node<String> {
List<StringNode> data = new ArrayList<>();
/**
* {@inheritDoc}
*/
@Override
public void addOne(Node<String> node) {
StringNode stringNode = (StringNode) node;
data.add(stringNode);
}
}
我希望通过让函数本身具有签名 public void,找到一种方法来避免在addOne的实现中从 Node 向 StringNode 转发addOne(StringNode节点)。关于如何更改Node的定义以实现接口的任何实现的任何想法?
我尝试搜索已经提出的问题,但无法找到匹配的匹配。任何有关已经讨论过的问题的指针也将不胜感激。
提前致谢!
答案 0 :(得分:3)
为什么分别使用String和StringNode?你能不能说出来
interface Node<T> {
void addOne(T node);
}
class StringNode implements Node<StringNode> {
List<StringNode> data = new ArrayList<StringNode>();
/**
* {@inheritDoc}
*/
@Override
public void addOne(StringNode node) {
StringNode stringNode = node;
data.add(stringNode);
}
}
答案 1 :(得分:2)
我就是这样做的:
interface Node<T extends Node<T>> {
void addOne(T node);
}
class StringNode implements Node<StringNode> {
List<StringNode> data = new ArrayList<StringNode>();
/**
* {@inheritDoc}
*/
@Override
public void addOne(StringNode node) {
data.add(node);
}
}
类似于U-No-Poo的建议,但更严格一些(强迫T实际上是一个节点)
答案 2 :(得分:1)
您可以引入另一个通用参数:
public interface Node<VALUE_TYPE, SELF> {
public void addOne(SELF u);
}
public class StringNode implements Node<String, StringNode> {
@Override
public void addOne(StringNode u) {
// TODO Auto-generated method stub
}
}
只要您想要传递该类型的节点,只要您需要实际值类型(在本例中为String)和VALUE_TYPE
,就可以使用SELF
。