Я работал над приложением для Android, использующим базу данных Firebase NoSql, и столкнулся с чем-то действительно странным.Приложение аварийно завершает работу с ошибкой
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
at com.sinic.mindfuck.DatabaseController$1.onDataChange(DatabaseController.java:52)
at com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-database@@16.0.5:183)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.0.5:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.0.5:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.0.5:55)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Контекст кода:
final HashMap<String, Double> values = new HashMap<>();
mDatabase.child("rooms").child(roomId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Object returnValue = dataSnapshot.getValue();
if(returnValue != null) {
for(Map.Entry<String, Double> value : ((HashMap<String,Double>)(returnValue)).entrySet()){
values.put(value.getKey(), value.getValue());
if(!(value.getValue() instanceof Double)) {
Log.e("inside", value.getValue().toString()); // that's the line it crashes on
}
}
}
}
Данные в базе данных:
85d54262:
100m run: 0.3
What: 100
Jumping Jack: 0.1
Push-up: 0.4
Sit-up: 0.25
В основном есть Map.Entry, который имеет «Что»поскольку он является ключевым и имеет значение Long, и если я пытаюсь выполнить с ним какие-либо операции, он падает, потому что компилятор предполагает, что он будет Double.
Никогда не видел ничего подобного, какие-либо идеи?