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
相关产品推荐
相关产品推荐

