![](/img/trans.png)
[英]How to create a List<String> from a List<Map<String, String>> in Dart?
[英]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.from
和List.cast
所做的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.