我已从 Firebase 读取了快照,并尝试从字符串列表节点中提取值。
当我这样做时:
List<String> answers = snapshot.value["answers"] as List<String>;
Run Code Online (Sandbox Code Playgroud)
通过上面的内容,我得到一个运行时错误:
类型
'List<dynamic>'不是'List<String>'类型转换中类型的子类型
但不知何故,下面这两种方法都有效:
List<String> answers = List<String>.from(snapshot.value["answers"])
Run Code Online (Sandbox Code Playgroud)
或这个:
List<String> answers = snapshot.value["answers"].cast<String>()
Run Code Online (Sandbox Code Playgroud)
第一个和其他两个构造之间有什么区别,为什么我不能通过转换操作将 the 转换List<dynamic>为 a ?List<String>as
让我们看一些例子:
var intList = <int>[1, 2, 3];
var dynamicList = intList as List<dynamic>; // Works.
var intList2 = dynamicList as List<int>; // Works.
Run Code Online (Sandbox Code Playgroud)
但:
var dynamicList = <dynamic>[1, 2, 3];
var intList = dynamicList as List<int>; // Fails at runtime.
Run Code Online (Sandbox Code Playgroud)
有什么不同?
在第一个示例中,intList的静态类型为List<int>,该对象的实际运行时类型也是List<int>。dynamicList具有静态类型List<dynamic>,但实际运行时类型为List<int>(与 是同一对象intList)。由于该对象最初是 a List<int>,因此该对象不可能List保存除int元素之外的任何内容,并且强制转换回 toList<int>是安全的。
在第二个示例中,dynamicList具有静态类型List<dynamic>和实际运行时类型List<dynamic>。由于该对象最初被构造为 a List<dynamic>,int因此可以向其中添加非元素,并且强制转换为List<int>不一定是安全的。因此,您必须创建一个新的List(或List类似的)对象来单独转换每个元素,这正是List.fromand 的List.cast作用。
| 归档时间: |
|
| 查看次数: |
711 次 |
| 最近记录: |