Я хочу прочитать карту 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 
ошибка в строке map.put((String)key,map.get(key)+1);
почему я не могу записать Integer в значение, если я объявил map как Map<String,Integer>?
можешь попробовать map.put((String) key, ((Integer) map.get(key)) + 1);
Я не знаю Firebase, но беглый взгляд на документацию показывает, что ваше предположение о возвращаемом значении dataSnapshot.getValue() неверно. firebase.google.com/docs/reference/android/com/google/fireba se /… Согласно этой ссылке, метод никогда не вернет ни Map<String,Integer>, ни Integer.
даже при выполнении map.put((String)key,((Integer) map.get(key))+1); это та же ошибка




Это связано с тем, что список ключей является конечной переменной, вы не можете изменить ее значение, поэтому вы можете просто инициализировать ее следующим образом:
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); }.
Переменная final не препятствует выполнению операций изменения переменной. Это только мешает вам переназначить переменную для ссылки на другой объект.
Когда вы делаете 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 Откуда вы знаете, что это тип? Что в результате map.get(key).getClass()?
Я не собирался пробовать это сейчас, поэтому, если я запишу в базу данных Map<String,Integer> с setValue, и после того, как я захочу его прочитать, это не гарантирует, что он все еще будет Map<String,Integer>?
Вы имеете дело с классом-оболочкой Integer, а не с примитивным int, поэтому он этого не делает. Сделайте приведение типов, а затем снова
new Integer(result_int)