Java类型转换异常:HashMap$Values无法转为HashMap问题求助
问题原因与解决方案
核心问题
你遇到的异常和编译错误,根源是父类Reader的getSpieler()方法返回的不是HashMap<String,Spieler>,而是HashMap.values()返回的Collection<Spieler>集合:
- 强行把
Collection转成HashMap,JVM会抛出HashMap$Values cannot be cast to class HashMap类型转换异常; Collection接口没有containsKey()方法,这是Map接口的专属方法,所以直接调用会编译报错。
解决方法
方案1:修改父类Reader的getSpieler()方法(优先选择)
如果有权限修改父类代码,直接调整方法返回值为Map<String,Spieler>(或具体的HashMap<String,Spieler>),让它返回完整的存储容器而非值集合:
// 父类Reader中的方法实现 public Map<String, Spieler> getSpieler() { return this.spielerMap; // 返回存储Spieler的HashMap本身,而非values()结果 }
修改后,CSVReader中调用getSpieler()时,直接就能调用containsKey()方法,无需类型转换。
方案2:无法修改父类时,自行处理返回的Collection
如果不能修改父类代码,可通过以下两种方式解决:
- 重新构建HashMap
遍历返回的Collection<Spieler>,将Spieler对象重新存入新的HashMap(需要Spieler类提供获取对应key的方法,比如getId()或getUsername()):Collection<Spieler> spielerList = super.getSpieler(); HashMap<String, Spieler> spielerMap = new HashMap<>(); for (Spieler s : spielerList) { // 假设Spieler有getKey()方法返回对应的键值 spielerMap.put(s.getKey(), s); } // 此时可正常调用spielerMap.containsKey(targetKey) - 直接遍历判断存在性
如果只是需要判断某个key对应的Spieler是否存在,无需完整HashMap,直接遍历集合即可:String targetKey = "需要检查的键"; boolean isExist = false; for (Spieler s : super.getSpieler()) { if (targetKey.equals(s.getKey())) { isExist = true; break; } }
内容的提问来源于stack exchange,提问作者NaCl
相关产品推荐
相关产品推荐

