Flutter 列表之间的差异<;字符串>;。from()和as List<;字符串>;飞镖

Flutter 列表之间的差异<;字符串>;。from()和as List<;字符串>;飞镖,flutter,dart,Flutter,Dart,我从Firebase中读取了一个快照,并试图从一个节点中提取值,该节点是一个字符串列表 当我这样做时: List<String> answers = snapshot.value["answers"] as List<String>; List answers=snapshot.value[“answers”]作为列表; 通过上述操作,我得到一个运行时错误,表示: 类型'List'不是类型转换中类型'List'的子类型 但不知何故,以下两种方法都有

我从Firebase中读取了一个快照,并试图从一个节点中提取值,该节点是一个字符串列表

当我这样做时:

List<String> answers = snapshot.value["answers"] as List<String>;
List answers=snapshot.value[“answers”]作为列表;
通过上述操作,我得到一个运行时错误,表示:

类型
'List'
不是类型转换中类型
'List'
的子类型

但不知何故,以下两种方法都有效:

List<String> answers = List<String>.from(snapshot.value["answers"])
List answers=List.from(snapshot.value[“answers”])
或者这个:

List<String> answers = snapshot.value["answers"].cast<String>()
List answers=snapshot.value[“answers”].cast()

第一个构造与其他两个构造之间有什么区别,为什么我不能使用
as
强制转换操作将
列表
强制转换为
列表

var intList=[1,2,3];
var dynamicList=intList as List;//作品
var intList2=动态列表作为列表;//作品
但是:

var dynamicList=[1,2,3];
var intList=dynamicList作为列表;//在运行时失败。
有什么区别

在第一个示例中,
intList
的静态类型为
List
,对象的实际运行时类型也是
List
dynamicList
的静态类型为
List
,但实际运行时类型为
List
(它与
intList
的对象相同)。由于对象最初是一个
列表
,因此
列表
对象不可能包含除
int
元素以外的任何元素,并且返回到
列表
是安全的

在第二个示例中,
dynamicList
的静态类型为
List
,实际运行时类型为
List
。由于对象最初构造为
列表
,因此可以向其添加非
int
s元素,而强制转换到
列表
并不一定安全。因此,您必须单独强制转换每个元素,这正是
List.from
List.cast所做的。

请参考此