Android 尝试从HashMap字符串获取双精度值时出错,该字符串是从Firebase获取的对象

Android 尝试从HashMap字符串获取双精度值时出错,该字符串是从Firebase获取的对象,android,casting,hashmap,firebase,double,Android,Casting,Hashmap,Firebase,Double,我不知道这是Firebase bug、Android bug还是我的错。我的问题是,在获取子对象时,由于某些原因,我无法从Hashmap中获取双精度值。为什么?因为 java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double 显然,firebase json对象中存储的每一个数值都会从HashMap返回。更奇怪的是?使用调试器,我实际上发现Android Studio知道它们有点像double/

我不知道这是Firebase bug、Android bug还是我的错。我的问题是,在获取子对象时,由于某些原因,我无法从Hashmap中获取双精度值。为什么?因为

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
显然,firebase json对象中存储的每一个数值都会从HashMap返回。更奇怪的是?使用调试器,我实际上发现Android Studio知道它们有点像double/float,事实上,如果要获取的值是2.5,它会打印出键“string”的hashmap值是2.5

当把这个值赋给我的双变量时,它会打印出上面的错误

这是密码

final double[] rating = {0};
final int[] nRatings = {0};
Firebase ref = new Firebase("https://MYAPP.firebaseio.com/reviews");
Query queryRef = ref.orderByChild("idCommented").equalTo(mId);
queryRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChild) {
        System.out.println(snapshot.getKey());

        Map map = (HashMap) snapshot.getValue();
        rating[0] += (double) map.get("noStars"); // This line causes error
        nRatings[0]++;

        mRatingBar.setRating((float)rating[0]/nRatings[0]);
    }
...
});
尽管如此,若我调试该迭代以检查映射值,它将打印出不能转换为Double的Long


知道为什么会这样吗

如果将
浮点值
存储到Firebase中,它将以
双精度
长格式
返回

这将有助于:

// ...
@Override
public void onChildAdded(DataSnapshot snapshot, String previousChild) {

    Number priceN = (Number) snapshot.getValue(); // Long or Double
    float price = priceN.floatValue();

    // (do whatever you want with the float) ...

}
//...

错误消息非常明确:该值是一个长(整数),因此不能转换为双精度。确保首先将值存储为浮动(即存储
1.0
而不是
1
)。或者在解析时转换为double:如果您编写
Map Map=(HashMaproaster,我不能这样做,因为Map必须具有存储其他值类型(如字符串)的功能。Frank转换为Number,然后转换为doubleValue有效。即使使用
1.5