簡體   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