【发布时间】:2023-04-09 11:15:01
【问题描述】:
我不知道这是 Firebase 错误、Android 错误还是我的错。我的问题是,在获取孩子时,由于某些原因,我无法从 Hashmap 获取 Double 值。为什么?因为
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
显然,存储在 firebase json 对象中的每个数值都会从 HashMap 作为 Long 返回。更奇怪的事?使用调试器,我实际上发现 Android Studio 知道它们有点双/浮点,实际上如果要获取的值是 2.5,它会打印出键“字符串”的哈希图的值是 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]);
}
...
});
不过,如果我应该调试该迭代以检查映射值,它会打印出 Long 不能转换为 Double
知道为什么会这样吗?
【问题讨论】:
-
错误信息非常明确:该值是长整数(整数),因此不能强制转换为双精度数。确保将值存储为浮点数(即存储
1.0而不是1)。或者解析时转成double:stackoverflow.com/questions/13855786/… -
如果你写
Map<String, Double> map = (HashMap<String, Double) snapshot.getValue();而不是Map map = (HashMap) snapshot.getValue();会发生什么?该行是否发生错误? -
roaster 我不能这样做,因为地图必须具有存储其他值类型(如字符串)的能力。弗兰克铸造到 Number 然后 doubleValue 工作。即使是
1.5这样的数字,问题也发生得更早
标签: android casting hashmap firebase double