【问题标题】:Difference between List<String>.from() and as List<String> in DartDart 中 List<String>.from() 和 as List<String> 之间的区别
【发布时间】:2021-04-22 23:00:06
【问题描述】:

我已从 Firebase 读取快照,并试图从作为字符串列表的节点中提取值。

当我这样做时:

List<String> answers = snapshot.value["answers"] as List<String>;

上面我得到一个运行时错误说:

类型'List&lt;dynamic&gt;' 不是类型转换中'List&lt;String&gt;' 类型的子类型

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

List<String> answers = List<String>.from(snapshot.value["answers"])

或者这个:

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

第一个和其他两个构造有什么区别,为什么我不能使用as 转换操作将List&lt;dynamic&gt; 转换为List&lt;String&gt;

【问题讨论】:

标签: flutter dart


【解决方案1】:

让我们来看看一些例子:

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 的静态类型为List&lt;int&gt;,对象的实际运行时类型也是List&lt;int&gt;dynamicList 的静态类型为List&lt;dynamic&gt;,但实际运行时类型为List&lt;int&gt;(它与intList 是同一个对象)。由于该对象最初是List&lt;int&gt;,因此List 对象不可能包含除int 元素之外的任何内容,并且转换回List&lt;int&gt; 是安全的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-25
    • 2014-08-30
    • 2014-07-22
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2019-01-08
    相关资源
    最近更新 更多