java.lang.Long не может быть приведен к java.lang.Integer - PullRequest
0 голосов
/ 04 мая 2018

Я хочу прочитать карту map из базы данных (Firebase) и сравнить ее с другой картой 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 data

ошибка в строке map.put((String)key,map.get(key)+1);

почему я не могу написать Integer в значении, если я объявил map как Map<String,Integer>?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Когда вы делаете 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, чтобы избежать этой ошибки.

Подробнее см. Здесь: Странная проблема с операцией Java Generics

0 голосов
/ 04 мая 2018

Это потому, что список ключей является окончательной переменной, вы не можете изменить ее значение, поэтому вы можете просто инициализировать его следующим образом: -

DatabaseReference keylist = user.child("motcle");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...