这里是一个代码片段,问题是subkey.Keyset,它“Type Mismatch:无法从元素类型对象开发到字符串”
for(String msgtype : subkey.keySet()){
int time = ((Integer)subkey.get(msgtype)).intValue();
time--;
if(time > 0){
newsubkey.put(msgtype, Integer.valueOf(time));
}
}
上面的这一部分是下面代码的一部分,其中错误包含“subkey.keySet
public void run(){
if(this.running){
return;
}
this.running = true;
while(this.running){
synchronized(LOCK){
if(msglist.size() != 0){
@SuppressWarnings("rawtypes")
HashMap newmsglist = new HashMap();
for(String player : msglist.keySet()){
@SuppressWarnings("rawtypes")
HashMap subkey = (HashMap)msglist.get(player);
@SuppressWarnings("rawtypes")
HashMap newsubkey = new HashMap();
for(String msgtype : subkey.keySet()){
int time = ((Integer)subkey.get(msgtype)).intValue();
time--;
if(time > 0){
newsubkey.put(msgtype, Integer.valueOf(time));
}
}
if(newsubkey.size() > 0){
newmsglist.put(player, newsubkey);
}
}
msglist = newmsglist;
}
}
if(this.running){
try{
sleep(this.sleepTime * 1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
this.running = false;
}
答案 0 :(得分:1)
请勿禁止警告:
@SuppressWarnings("rawtypes")
HashMap subkey = (HashMap)msglist.get(player);
你在这里有效地说“让我们假设子项是从对象到对象的映射。”
两行后,您希望获得String键。
难怪编译器很困惑。
答案 1 :(得分:0)
首先,不要压制警告!他们可以帮助您避免像您在这里犯的错误。
HashMap是一个标准的java集合对象,它允许任意类型的元素(称为键)再次映射到另一个可定义类型(称为值)的元素集。
虽然实际的映射过程基于对象哈希,但是通过泛型来最终促进将任意类型的键映射到任意类型值的能力。如果你不知道它们是什么,我建议你read here。
归结为,如果未指定,HashMap将Object
个键映射到Object
值。虽然这个HashMap在技术上在映射方面都是包容性的,但是当你将元素放入HashMap(它们被存储的地方,非常含糊地,作为Object
类型的元素)时,你会丢失类型信息。
当您尝试检索映射的密钥集并使用增强的for循环对其进行迭代时,编译器意识到它无法安全地将一组类型Object
强制转换为单个String
个对象(即Object
不等于或String
的子类)强制编译器抛出所述错误。
要修复,您需要做的就是为HashMap指定一个更具体的类型,如下所示:
HashMap<String, Integer> subkey;
或在你的情况下:
HashMap<String, Integer> subkey = msglist.get(player);
假设msglist
是带有签名Map<String, HashMap<String, Integer>>
的地图
或:
HashMap<String, Integer> subkey = (HashMap<String, Integer>) msglist.get(player);
如果msglist
是带有签名Map<String, Object>