ArrayList的get方法返回Object而非AccessCode类,调用getUsed()报错
问题原因
你遇到的编译错误核心原因是**saveCodes方法的参数使用了不带泛型的原始ArrayList类型**。在Java中,原始集合类型的元素会被当作Object处理,所以codeList.get(i)返回的是Object对象,而Object类并没有定义getUsed()方法,编译器自然找不到这个符号。虽然打印元素时显示的是AccessCode对象,这是因为打印时默认调用了对象的toString()方法,但编译期的类型检查只认声明的Object类型。
解决方案
方案1:给方法参数添加泛型约束(推荐)
将saveCodes方法的参数从ArrayList codeList改为ArrayList<AccessCode> codeList,这样集合的元素类型被明确指定为AccessCode,get(i)会直接返回AccessCode对象,无需额外转换即可调用getUsed()方法。
修改后的Robot类相关代码:
import java.util.ArrayList; import java.util.HashMap; class Robot { ArrayList<AccessCode> usedAccessCodes = new ArrayList<>(); ArrayList<AccessCode> unusedAccessCodes = new ArrayList<>(); // 同时建议给HashMap也加上泛型约束,避免后续问题 HashMap<String, ArrayList<AccessCode>> codeHashMap = new HashMap<>(); public void saveCodes(ArrayList<AccessCode> codeList){ AccessCode temp; for (int i = 0; i < codeList.size(); i ++){ System.out.println(codeList.get(i)+"\n"); if (codeList.get(i).getUsed()) { usedAccessCodes.add(codeList.get(i)); } else{ unusedAccessCodes.add(codeList.get(i)); } } } public void buildHashMap(){ codeHashMap.put("used", usedAccessCodes); codeHashMap.put("unused", unusedAccessCodes); } }
方案2:强制类型转换(不推荐)
如果必须使用原始集合类型,可以在调用方法前将codeList.get(i)强制转换为AccessCode类型,但这种方式存在类型转换失败的风险(比如集合中混入非AccessCode对象时会抛出ClassCastException),不建议使用:
if (((AccessCode)codeList.get(i)).getUsed()) { usedAccessCodes.add((AccessCode)codeList.get(i)); } else{ unusedAccessCodes.add((AccessCode)codeList.get(i)); }
内容的提问来源于stack exchange,提问作者user28181162
相关产品推荐
相关产品推荐

