有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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(StringNode Node),来避免在addOne的实现中从NodeStringNode的降级。对于如何更改节点的定义以实现接口的任何实现,有什么想法吗

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

提前谢谢


共 (3) 个答案

  1. # 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,每当要传递该类型的节点时使用SELF

  2. # 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实际上是一个节点)

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