繁体   English   中英

列表之间的区别<string> .from() 和列表<string>在 Dart</string></string>

[英]Difference between List<String>.from() and as List<String> in Dart

我已经从 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>

让我们来看看一些例子:

var intList = <int>[1, 2, 3];
var dynamicList = intList as List<dynamic>; // Works.
var intList2 = dynamicList as List<int>; // Works.

但:

var dynamicList = <dynamic>[1, 2, 3];
var intList = dynamicList as List<int>; // Fails at runtime.

有什么不同?

在第一个示例中, intList的 static 类型为List<int> ,而 object 的实际运行时类型也是List<int> dynamicList具有List<dynamic>的 static 类型,但具有List<int>的实际运行时类型(与intList相同的 object )。 由于 object 最初是List<int> ,因此List object 不可能保存除int元素之外的任何内容,并且转换回List<int>是安全的。

在第二个示例中, dynamicList具有 List<dynamic> 的 static 类型和List<dynamic> List<dynamic>实际运行时类型。 由于 object 最初构造为List<dynamic> ,因此可能已将非int元素添加到其中,并且强制转换为List<int>不一定安全。 因此,您必须单独转换每个元素,这正是List.fromList.cast所做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM