You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Stack的push方法无法工作,Eclipse提示参数不适用于原始类型

问题分析与解决

核心错误原因

你声明的栈是Stack<Bracket>,这表示它只能存储Bracket类型的对象,但你调用push(next)时传入的是char原始类型值,两者类型不兼容,这就是Eclipse提示“参数不适用于原始类型”的根本原因。

另外代码还有个潜在问题:循环中每次都会执行openingBrackets.pop(),如果还没push过元素就执行pop,会直接抛出EmptyStackException空栈异常。

两种解决方案

方案1:如果你确实需要使用自定义的Bracket类

假设你的Bracket类有接收char参数的构造方法,需要将char值包装成Bracket对象再入栈:

Stack<Bracket> openingBrackets = new Stack<>();

for (int position = 1; position <= text.length(); ++position) {
    char next = text.charAt(position - 1);
    if (next == '(' || next == '[' || next == '{') {
        // 将char转换为Bracket对象后入栈
        openingBrackets.push(new Bracket(next));
    }
    // 先判断栈非空再弹出,避免空栈异常
    if (!openingBrackets.isEmpty()) {
        System.out.print(openingBrackets.pop());
    }
}

方案2:如果不需要Bracket类,仅需存储字符

Java集合框架不能直接存储原始类型,需要使用对应的包装类Character,修改栈的泛型声明即可:

// 泛型改为Character,支持存储字符(会自动装箱/拆箱)
Stack<Character> openingBrackets = new Stack<>();

for (int position = 1; position <= text.length(); ++position) {
    char next = text.charAt(position - 1);
    if (next == '(' || next == '[' || next == '{') {
        openingBrackets.push(next); // char会自动装箱为Character
    }
    // 先判断栈非空再弹出
    if (!openingBrackets.isEmpty()) {
        System.out.print(openingBrackets.pop());
    }
}

内容的提问来源于stack exchange,提问作者BigAD97

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:39:57