【问题标题】:Why can't i use Hashmap directly ,why casting it为什么我不能直接使用 Hashmap,为什么要转换它
【发布时间】:2022-01-26 11:04:18
【问题描述】:

我正在尝试从 Firebase 检索数据,所以我使用 Hashmap 来处理它,但我想知道为什么要投射 Hashmap,为什么不能直接使用它。 请给出一个深刻而简单的语言答案(应该是Kotlin)

代码如下:

var map = snapshot.getValue() as Hashmap<String,String>

【问题讨论】:

  • 所以你基本上会问,为什么需要添加as Hashmap&lt;String, String&gt;
  • 我的问题是为什么“as”为什么我不能在没有强制转换的情况下使用它

标签: android kotlin firebase-realtime-database hashmap


【解决方案1】:

当在包含多个值的DataSnapshot 上调用时,getValue() 返回一个Map&lt;String,Object&gt;,因为(虽然键是定义字符串)它无法知道数据库中所有值的类型。

如果你知道所有的值都是字符串,你可以像你一样将结果转换为Map&lt;String,String&gt;,但它确实需要你转换从getValue()返回的结果。

【讨论】:

【解决方案2】:

DataSnapshot#getValue()方法返回一个Object类型的对象:

getValue() 将此快照中包含的数据作为本机类型返回。返回的可能的类型是:

  • 布尔值
  • 字符串
  • 地图
  • 列表

由于 Firebase 实时数据库中的每个节点都可以由键和值对(实际上是映射)表示,因此您必须使用该转换才能实际读取数据。

或者,您可以使用DataSnapshot#getValue(Class valueType) 将每个节点映射到特定类的对象。

编辑:

我研究了 getValue() 只是一个对象,你能告诉我它是哪个类吗?

getValue() 返回Object 类型的对象。 Object 类是所有类都继承自的类。

如果我们知道某个类的对象可以返回 String、Boolean、Map 等,那么我们每次都需要转换它的返回类型。

是的,您必须转换为相应的值。

就像我的情况一样,我想使用一个映射,所以我将它转换为 hashmap 好...但是如果我想从 getValue() 获得字符串值,那么我需要将它转换为 String 对吗?。

是的,确实,这就是你必须做的。或者您可以使用替代解决方案。

【讨论】:

  • 嘿希瓦姆。我可以帮助您了解其他信息吗?
  • 是的,亚历克斯,我需要更多帮助,我研究了 getValue() 只是一个对象,所以你能告诉我它是哪个类......如果我们知道的话,还有一件事类的对象可以返回字符串、布尔值、map 等。然后每次我们需要转换它的返回类型时,就像在我的情况下我想使用 map 所以我将它转换为 hashmap 好吧......但是如果我想从 getValue 获得字符串值() 那么我需要转换为字符串吗?希望你理解我的问题
  • 在这种情况下,请查看我更新的答案。现在清楚了吗?
  • 是的,终于清楚了...我现在不能提供声誉,因为我是新人,但稍后我会...非常感谢您的努力,先生
  • 不客气,希瓦姆。很高兴听到现在很清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2010-10-11
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
相关资源
最近更新 更多