java - 通用推送到堆栈会出现编译错误

标签 java generics

我有一个 Node 类定义如下 -

public static class Node<T> {
    public T value;
    public Node<T> left;
    public Node<T> right;

    public Node(T value) {
        this.value = value;
        left = null;
        right = null;
    }

}

现在我正在尝试添加/推送 Node<Integer>Stack<Node<T>>它给了我一个编译错误。

private static <T> Node<T> createTree(Expression expression) {
    Stack<Node<T>> nodeStack = new Stack<>();
    Stack<Token> tokenStack = new Stack<>();

    Token token = getNextToken(expression);

    while (token != null) {
        if (token instanceof OpenParenthesis) {
            tokenStack.push(token);
        } else if (token instanceof Element) {
            nodeStack.push(new Node<Integer>(((Element) token).value)); // Here
        } else if (token instanceof EmptyElement) {
            nodeStack.push(null);
        } else if (token instanceof CloseParenthesis) {
            if (nodeStack.size() == 1) {
                tokenStack.pop();
                return nodeStack.pop();
            }

            tokenStack.pop();
            Node<T> right = nodeStack.pop();
            Node<T> left = nodeStack.pop();
            Node<T> node = nodeStack.pop();
            node.left = left;
            node.right = right;
            nodeStack.push(node);
        }

        token = getNextToken(expression);
    }

    return null;
}

该行无法编译 -

nodeStack.push(new Node<Integer>(((Element) token).value));

带有消息-

push(Node<T>) in Stack cannot be applied to (Node<java.lang.Integer>)

最佳答案

<T>类型参数是方法级别参数。 IE。您在方法签名中定义了它:

private static <T> Node<T> createTree(Expression expression

您的节点堆栈具有完全相同的类型:

Stack<Node<T>> nodeStack = new Stack<>();

因此,当您插入该堆栈时,您需要完全相同的类型 token :

nodeStack.push(new Node<T>(((Element) token).value));
//                   ^^^^^^ - using <T>

那么,如何让它为您服务呢?如果确定全部推送到nodeStack将是nullNode<Integer> - 看起来就是这样 - 那么你可以摆脱方法级类型标记:

private static Node<Integer> createTree(Expression expression) {
    Stack<Node<Integer>> nodeStack = new Stack<>();
    // ...
    } else if (token instanceof Element) {
         nodeStack.push(new Node<Integer>(((Element) token).value)); // Here
    }
    // ...
            Node<Integer> right = nodeStack.pop();
            Node<Integer> left = nodeStack.pop();
            Node<Integer> node = nodeStack.pop();
    // ...
    }
}

关于java - 通用推送到堆栈会出现编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43908015/

相关文章:

java - `if ( x = 0 )` 曾经是 Java 可编译的吗

java - 浏览器停止加载后停止服务器线程

java - 无限 While 循环

java - 如何使用泛型向 java Map 添加相同的对象类型

variables - Rust 中泛型变量的变异类型

java - JPA 无法填充连接表中的条目

java - 旋转图像时背景为黑色

java - 我怎么能在 map 上说 "these two generic types are the same"?

c# - 是否有可用于 + 运算符的通用约束?

javascript - 多个泛型参数类型推断不起作用