我已经从Firebase中读取了一个快照,并且正在尝试从一个字符串列表节点中提取值。
执行此操作时:
List<String> answers = snapshot.value["answers"] as List<String>;
上面我得到一个运行时错误说:
类型'List<dynamic>'
不是类型转换中类型'List<String>'
的子类型
但不知何故下面这两种方法都起作用:
List<String> answers = List<String>.from(snapshot.value["answers"])
或者这样:
List<String> answers = snapshot.value["answers"].cast<String>()
第一个和另外两个构造之间的区别是什么?为什么我不能使用as
转换操作将List<dynamic>
转换为List<String>
?
1条答案
按热度按时间inb24sb21#
让我们来看看一些例子:
但是:
有什么区别吗?
在第一个示例中,
intList
的静态类型为List<int>
,对象的实际运行时类型也为List<int>
。dynamicList
的静态类型为List<dynamic>
,但实际运行时类型为List<int>
(它与intList
是同一个对象)。由于该对象最初是List<int>
,因此List
对象不可能包含除int
元素之外的任何内容,并且转换回List<int>
是安全的。在第二个示例中,
dynamicList
的静态类型为List<dynamic>
,实际运行时类型为List<dynamic>
。由于该对象最初被构造为List<dynamic>
,因此可以向其中添加非int
元素,而转换为List<int>
并不一定安全。(或类似于List
的)对象,该对象单独转换每个 element,这正是List.from
和List.cast
所做的。