簡體   English   中英

無法將java.lang.Long強制轉換為java.lang.Integer

[英]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) {

        }
    });



}

這是我要在Firebase中寫的值 數據

錯誤在map.put((String)key,map.get(key)+1);

如果我將map聲明為Map<String,Integer>為什么不能在值中寫一個Integer

當您執行Map<String,Integer> map = (Map) dataSnapshot.getValue(); ,您可以保證mapMap ,但不能保證它是Map<String, Integer> 由於泛型會被擦除並且在運行時不可用,只要dataSnapshot.getValue()是某種Map ,此轉換就可以成功。

因為您已將Hmap聲明為Map<String,Integer> ,所以當您從地圖中獲取值時,它將嘗試將其HmapInteger ,但實際上並沒有任何保證能提前保證它將成為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM