Java LinkedList复制报错:clone()方法为何提示访问权限错误?
问题解答
关于红色波浪线
这个红色波浪线是IntelliJ的编译错误提示标记,代表该行代码存在语法或访问权限类的编译错误,代码无法正常编译运行。
clone()报错原因
你将leftover声明为Queue<Character>类型,虽然实际实例是LinkedList,但Java编译阶段只会检查变量声明类型的可用方法。Queue接口并未重写Object类的clone()方法,而Object的clone()是protected访问权限,只能在类内部或子类中调用,因此你无法通过Queue类型的引用直接调用该方法。
修正方案
方案1:修改变量声明类型
把leftover的声明改为LinkedList<Character>,这样就能直接调用LinkedList重写的clone()方法,且无需强制类型转换:
LinkedList<Character> leftover = new LinkedList<>(); // ... 其他代码 tem_left = leftover.clone();
方案2:使用集合构造方法复制(更推荐)
Java集合框架提供了通过现有集合创建新集合的构造方法,这种方式更通用,也符合集合操作规范:
tem_left = new LinkedList<>(leftover);
额外代码逻辑错误修正
你的内层循环存在两处逻辑错误:
- 循环中误用
stone_list[i],应该从tem_left队列中取出当前元素进行判断 - 直接循环
tem_left.size()会因为每次poll()操作改变队列大小,导致循环次数不准确,需要先记录队列初始大小
修正后的内层循环代码:
int size = tem_left.size(); for (int j = 0; j < size; j++) { char currentStone = tem_left.poll(); if (tem_jewel != currentStone) { leftover.offer(currentStone); } else { count++; } }
完整修正后的代码
package lc_771_Jewels; import java.util.LinkedList; import java.util.Queue; public class Jewels_discuss { public int count_jewels(String jewels, String stones){ char[] jewels_kind = jewels.toCharArray(); char[] stone_list = stones.toCharArray(); int count = 0; Queue<Character> tem_left = new LinkedList<>(); for (char stone : stone_list) { tem_left.offer(stone); } for (char tem_jewel : jewels_kind) { Queue<Character> leftover = new LinkedList<>(); int size = tem_left.size(); for (int j = 0; j < size; j++) { char currentStone = tem_left.poll(); if (tem_jewel != currentStone) { leftover.offer(currentStone); } else { count++; } } tem_left = new LinkedList<>(leftover); } return count; } }
内容的提问来源于stack exchange,提问作者acfun
相关产品推荐
相关产品推荐

