Java.lang.Long нельзя преобразовать в java.lang.Integer

Я хочу прочитать карту 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 Java.lang.Long нельзя преобразовать в java.lang.Integer

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

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

Вы имеете дело с классом-оболочкой Integer, а не с примитивным int, поэтому он этого не делает. Сделайте приведение типов, а затем снова new Integer(result_int)

Red Boy 04.05.2018 19:32

можешь попробовать map.put((String) key, ((Integer) map.get(key)) + 1);

YCF_L 04.05.2018 19:35

Я не знаю Firebase, но беглый взгляд на документацию показывает, что ваше предположение о возвращаемом значении dataSnapshot.getValue() неверно. firebase.google.com/docs/reference/android/com/google/fireba‌ se /… Согласно этой ссылке, метод никогда не вернет ни Map<String,Integer>, ни Integer.

Radiodef 04.05.2018 19:40

даже при выполнении map.put((String)key,((Integer) map.get(key))+1); это та же ошибка

Anis Kaloun 04.05.2018 19:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
5 650
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Я попытался создать другую карту и скопировать содержимое, но это все та же ошибка 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); }.

Anis Kaloun 04.05.2018 19:59

Переменная final не препятствует выполнению операций изменения переменной. Это только мешает вам переназначить переменную для ссылки на другой объект.

VeeArr 04.05.2018 21:41
Ответ принят как подходящий

Когда вы делаете 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

Фактические типы значений dataSnapshot.getValue - это Map<String,Integer>, поэтому я поместил его на карту с <String,Integer>

Anis Kaloun 04.05.2018 22:46

@Anis Kaloun Откуда вы знаете, что это тип? Что в результате map.get(key).getClass()?

VeeArr 04.05.2018 23:01

Я не собирался пробовать это сейчас, поэтому, если я запишу в базу данных Map<String,Integer> с setValue, и после того, как я захочу его прочитать, это не гарантирует, что он все еще будет Map<String,Integer>?

Anis Kaloun 04.05.2018 23:57

Другие вопросы по теме