Java—重写泛型类型的接口方法时如何获取具体的参数类型

Java—重写泛型类型的接口方法时如何获取具体的参数类型,java,generics,Java,Generics,我是一个泛型新手,我无法找到最好的方法来实现这一点。如果我做了一些明显错误的事情,请随时指出 interface Node<T> { void addOne(Node<T> node); } class StringNode implements Node<String> { List<StringNode> data = new ArrayList<>(); /** * {@inheritDo

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

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

}
接口节点{
void addOne(节点);
}
类StringNode实现节点{
列表数据=新的ArrayList();
/**
*{@inheritardoc}
*/
@凌驾
公共void addOne(节点){
StringNode StringNode=(StringNode)节点;
data.add(stringNode);
}
}
我希望找到一种方法,通过使函数本身具有签名public void addOne(StringNode Node),避免在addOne的实现中从节点到StringNode的降级。对于如何更改节点的定义以实现接口的任何实现,有什么想法吗

我试着搜索已经问过的问题,但没有找到一个匹配的。对于已经讨论过的任何问题,我们也将不胜感激


提前谢谢

为什么要分别使用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);
    }

}
接口节点{
void addOne(T节点);
}
类StringNode实现节点{
列表数据=新的ArrayList();
/**
*{@inheritardoc}
*/
@凌驾
公共void addOne(StringNode节点){
StringNode StringNode=节点;
data.add(stringNode);
}
}

您可以引入另一个通用参数:

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  
  }
}
公共接口节点{
公共无效地址(自u);
}
公共类StringNode实现节点{
@凌驾
公共void addOne(StringNode u){
//TODO自动生成的方法存根
}
}

每当需要实际值类型(在本例中为字符串)时,请使用
VALUE\u TYPE
;每当需要传递该类型的节点时,请使用
SELF

我本可以这样做:

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

}
接口节点{
void addOne(T节点);
}
类StringNode实现节点{
列表数据=新的ArrayList();
/**
*{@inheritardoc}
*/
@凌驾
公共void addOne(StringNode节点){
数据添加(节点);
}
}

与U-No-Poo的建议类似,但更严格一点(强制T实际上是一个节点)

“但更严格一点”是的,但在没有必要的时候为什么要严格一点?当然,这取决于如何使用它,但在这种情况下,它更符合问题中的示例。