Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类型不匹配:无法从元素类型对象发展为字符串_Java - Fatal编程技术网

Java 类型不匹配:无法从元素类型对象发展为字符串

Java 类型不匹配:无法从元素类型对象发展为字符串,java,Java,下面是subkey.Keyset的代码片段,它“类型不匹配:无法从元素类型对象发展为字符串” 上面的这一位是下面代码中错误由“subkey.keySet”组成的部分 public void run(){ if(this.running){ return; } this.running = true; while(this.running){ synchronized(LOCK){ if(msglist.size

下面是subkey.Keyset的代码片段,它“类型不匹配:无法从元素类型对象发展为字符串”

上面的这一位是下面代码中错误由“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;
}

不抑制警告:

@SuppressWarnings("rawtypes")
HashMap subkey = (HashMap)msglist.get(player);
在这里,您可以有效地说“假设子键是从对象到对象的映射。”

两行之后,您将获得字符串键


难怪编译器会感到困惑。

首先,不要抑制警告!它们可以帮助您避免犯类似于此处所犯的错误

HashMap是一个标准java集合对象,它允许任意类型的元素(称为键)映射到另一组任意的、可定义类型的元素(称为值)

虽然实际的映射过程是基于对象散列的,但是泛型最终促进了将任意类型的键映射到任意类型的值的能力

归根结底,如果未指定,HashMap将把
Object
键映射到
Object
值。虽然这个HashMap在映射方面在技术上是包罗万象的,但当您将元素放入HashMap时,您会丢失类型信息(它们作为
Object
类型的元素存储在非常模糊的位置)

当您尝试检索映射的键集并使用增强的for循环对其进行迭代时,编译器意识到它无法将一组类型
对象
安全地强制转换为单个
字符串
对象(即
对象
不等于
字符串
的子类)强制编译器抛出所述错误

要修复此问题,只需为HashMap指定一个更具体的类型,如下所示:

HashMap<String, Integer> subkey;

如果
msglist
是带有类型签名的映射
map

a
.keySet()
返回一个Java
集合
;您的键必须是
字符串
类型,所以子键中的键不是字符串……您的问题到底是什么?对Java来说非常陌生,只需要知道如何修复错误@machine错误修复@ManuOkay抱歉,我已经修复了这个问题,现在我有一个问题,上面写着方法getInstance()对于类型MsgThread@ingo是未定义的,非常感谢您花时间在这方面,这意味着很多:如果您能帮我看一下,并告诉我为什么getInstance会使用方法getInstance()对于MsgThread类型是未定义的,我将如何定义它?@CPUTerminator@Noongrboy关于这个问题,我完全偏离了主题,但我确实查看了您的代码,在任何地方都找不到它的声明或导入语句(MsgThread)。我根本无法确定或甚至无法推断它是什么类型的对象,因此无法帮助您。如果它是您自己创建的某个类,请尝试自己调试该类。如果您确实遇到了问题,请将其作为单独的问题发布。包括相关的代码段,具体描述您的问题,并演示您已经为之付出的努力解决眼前的问题。
HashMap<String, Integer> subkey;
HashMap<String, Integer> subkey = msglist.get(player);
HashMap<String, Integer> subkey = (HashMap<String, Integer>) msglist.get(player);