Java - 如何在覆盖泛型类型的接口方法时获取具体参数类型

时间:2012-07-10 07:37:13

标签: java generics

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

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的定义以实现接口的任何实现的任何想法?

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

提前致谢!

3 个答案:

答案 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