Компилятор Java заключает, что переменная является Double, аварийно завершает работу, поскольку это на самом деле Long - PullRequest
0 голосов
/ 09 декабря 2018

Я работал над приложением для 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.

Никогда не видел ничего подобного, какие-либо идеи?

1 Ответ

0 голосов
/ 09 декабря 2018

номер использования класса

for(Map.Entry<String, Number> value :  ((Map<String, Number>)(returnValue)).entrySet()) {
    values.put(value.getKey(), value.getValue().doubleValue());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...