[英]java.lang.Long cannot be cast to java.lang.Integer
我想從數據庫(Firebase)中讀取一個地圖map
,並將其與另一個地圖motcle
進行比較,如果我發現重復的鑰匙,我會增加map
鑰匙的值,那么我就遇到了ClassCastException。 編碼:
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);
如果我將map
聲明為Map<String,Integer>
為什么不能在值中寫一個Integer
?
當您執行Map<String,Integer> map = (Map) dataSnapshot.getValue();
,您可以保證map
是Map
,但不能保證它是Map<String, Integer>
。 由於泛型會被擦除並且在運行時不可用,只要dataSnapshot.getValue()
是某種Map
,此轉換就可以成功。
因為您已將Hmap
聲明為Map<String,Integer>
,所以當您從地圖中獲取值時,它將嘗試將其Hmap
為Integer
,但實際上並沒有任何保證能提前保證它將成為Integer。 。 結果,如果該值實際上是Long
,它將嘗試將Long
轉換為Integer
並失敗(因為Long
不會擴展Integer
,並且擴展操作不適用於盒裝類型)。
您需要找出dataSnapshot.getValue()
值的實際類型是什么,並將其dataSnapshot.getValue()
轉換為正確的Map
類型,以避免此錯誤。
有關更多詳細信息,請參見此處: 關於Java泛型操作的奇怪問題
這是因為鍵列表是一個最終變量,您無法更改其值,因此可以像這樣初始化它:-
DatabaseReference keylist = user.child("motcle");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.