java.lang.Long 无法转换为 java.lang.Integer

Ani*_*oun 5 java collections firebase

map我想从数据库(Firebase)读取地图,并将其与另一个地图进行比较motcle,如果我找到重复的键,我会增加该键的值map,我遇到了 ClassCastException。\n代码:

\n\n
public void addMotcle(final Map motcle, String Userid)\n{\n    mDatabase = FirebaseDatabase.getInstance().getReference("User");\n    DatabaseReference user = mDatabase.child(Userid);\n    final DatabaseReference keylist = user.child("motcle");\n    keylist.addValueEventListener(new ValueEventListener() {\n        @Override\n        public void onDataChange(DataSnapshot dataSnapshot) {\n            if(dataSnapshot.exists())\n            {   \n                //I tried to put the map in another map and change it but \n                //It is still the same error\n                Map<String,Integer> map = (Map) dataSnapshot.getValue();\n                Map<String,Integer>Hmap= new HashMap<>();\n                Hmap.putAll(map);\n                //if there is duplicate we incremente les mots cl\xc3\xa9\n                for (Object key : motcle.keySet()) {\n                    if (Hmap.containsKey(key)) {\n                        Hmap.put((String)key,((Integer) Hmap.get(key))+1);\n                    }\n                    else\n                    {\n                        Hmap.put((String) key,1);\n                    }\n                }\n               keylist.setValue(Hmap);\n\n            }\n            else\n            {\n             keylist.setValue(motcle);\n\n            }\n        }\n\n        @Override\n        public void onCancelled(DatabaseError databaseError) {\n\n        }\n    });\n\n\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我想在 Firebase 中写入的值数据

\n\n

错误在行中 map.put((String)key,map.get(key)+1);

\n\n

如果我声明为 , 为什么不能Integer在值中写入 an ?mapMap<String,Integer>

\n

Vee*_*Arr 2

当你这样做时Map<String,Integer> map = (Map) dataSnapshot.getValue();,你保证那map是 a Map,但不能保证它是 a Map<String, Integer>。由于泛型被删除且在运行时不可用,因此只要dataSnapshot.getValue()是某种类型的 a Map,此转换就会成功。

因为您已声明Hmap为 a Map<String,Integer>,所以当您从映射中获取值时,它会尝试将其转换为Integer,但实际上没有任何东西可以提前保证它将是 Integer。因此,如果该值实际上是 a Long,它将尝试将其转换Long为 anInteger并失败(因为Long不扩展Integer,并且加宽操作不适用于装箱类型)。

您需要找出 值的实际类型dataSnapshot.getValue()是什么,并将其转换为正确的类型Map以避免此错误。

有关更多详细信息,请参阅此处:关于 Java 泛型操作的奇怪问题