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

时间:2018-05-04 17:27:06

标签: java firebase collections

我想从数据库(Firebase)中读取地图map,并将其与另一个地图motcle进行比较,如果我找到重复的密钥,我会在{{中增加密钥的值1}},我有一个ClassCastException。 代码:

map

以下是我要在Firebase Data

中撰写的值

错误在行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

2 个答案:

答案 0 :(得分:1)

执行Map<String,Integer> map = (Map) dataSnapshot.getValue();后,您可以保证mapMap,但不是Map<String, Integer>。由于泛型被擦除且在运行时不可用,只要dataSnapshot.getValue()是某种类型的Map,此演员表就会成功。

因为您已将Hmap声明为Map<String,Integer>,所以当您从地图中获取值时,它会尝试将其转换为Integer,但没有任何内容实际上保证它将是一个整数。因此,如果该值实际为Long,则会尝试将Long强制转换为Integer并失败(因为Long不会扩展Integer },并且扩展操作不适用于盒装类型。)

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

请点击此处了解详情:Weird problem about Java Generics operation

答案 1 :(得分:-1)

这是因为密钥列表是最终变量,您无法更改其值,因此您可以像这样初始化它: -

DatabaseReference keylist = user.child("motcle");