类型不匹配:无法从元素类型对象开发到字符串

时间:2015-04-20 17:28:21

标签: java

这里是一个代码片段,问题是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;
}

2 个答案:

答案 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>

的地图