3

我是一个泛型新手,我无法找到实现这一目标的最佳方法。如果我做的事情明显错误,请随时指出。

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);
    }

}

我希望找到一种方法来避免在 addOne 的实现中从NodeStringNode的向下转换,方法是让函数本身具有签名public void addOne(StringNode node)。关于如何更改 Node 的定义以实现接口的任何实现的任何想法?

我尝试搜索已经提出的问题,但无法找到匹配的结果。任何指向已经讨论过的问题的指针也将不胜感激。

提前致谢!

4

3 回答 3

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);
    }

}
于 2012-07-10T07:44:45.907 回答
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 实际上是一个节点)

于 2012-07-10T07:56:51.200 回答
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  
  }
}

VALUE_TYPE每当您需要实际值类型(在本例中为 String)以及SELF想要传递该类型的节点时使用。

于 2012-07-10T07:54:59.277 回答