我想从数据库(Firebase)中读取地图map
,并将其与另一个地图motcle
进行比较,如果我找到重复的密钥,我会在{{中增加密钥的值1}},我有一个ClassCastException。
代码:
map
中撰写的值
错误在行public void addMotcle(final Map motcle, String Userid)
{
mDatabase = FirebaseDatabase.getInstance().getReference("User");
DatabaseReference user = mDatabase.child(Userid);
final DatabaseReference keylist = user.child("motcle");
keylist.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists())
{
//I tried to put the map in another map and change it but
//It is still the same error
Map<String,Integer> map = (Map) dataSnapshot.getValue();
Map<String,Integer>Hmap= new HashMap<>();
Hmap.putAll(map);
//if there is duplicate we incremente les mots clé
for (Object key : motcle.keySet()) {
if (Hmap.containsKey(key)) {
Hmap.put((String)key,((Integer) Hmap.get(key))+1);
}
else
{
Hmap.put((String) key,1);
}
}
keylist.setValue(Hmap);
}
else
{
keylist.setValue(motcle);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
如果我将map.put((String)key,map.get(key)+1);
声明为Integer
,为什么我不能在值中写map
?
答案 0 :(得分:1)
执行Map<String,Integer> map = (Map) dataSnapshot.getValue();
后,您可以保证map
是Map
,但不是Map<String, Integer>
。由于泛型被擦除且在运行时不可用,只要dataSnapshot.getValue()
是某种类型的Map
,此演员表就会成功。
因为您已将Hmap
声明为Map<String,Integer>
,所以当您从地图中获取值时,它会尝试将其转换为Integer
,但没有任何内容实际上保证它将是一个整数。因此,如果该值实际为Long
,则会尝试将Long
强制转换为Integer
并失败(因为Long
不会扩展Integer
},并且扩展操作不适用于盒装类型。)
您需要找出dataSnapshot.getValue()
的实际值类型,并将其转换为正确的Map
类型以避免此错误。
答案 1 :(得分:-1)
这是因为密钥列表是最终变量,您无法更改其值,因此您可以像这样初始化它: -
DatabaseReference keylist = user.child("motcle");