我正在嘗試將 List 作為值分配給 Map 中的欄位。
但是,如果我改變 Map 中的型別,則 List 中似乎不再提供這些方法。
例子:
var list = [1,2];
var myMap = {
'list' : list,
//'commentOut' : 3,
};
print("${myMap['list'].runtimeType}");
print("${myMap['list']!.length}");
輸出
JSArray<int>
2
但是,如果我取消注釋 'commentOut' : ' 我得到錯誤
Error: The getter 'length' isn't defined for the class 'Object'.
有沒有辦法讓它作業,或者我誤解了我們不能用 Maps 做的一些基本的事情?
uj5u.com熱心網友回復:
當你這樣做時:
var list = [1,2];
var myMap = {
'list' : list,
};
那么推斷的型別myMap是Map<String, List<int>>。
當你這樣做時:
var myMap = {
'list' : list,
'commentOut' : 3,
};
yourMap的值現在是異構的,因此 Dart 將值型別推斷為最接近的公共基型別。在這種情況下,List<int>and的公共基型別int是Object,因此myMap推斷的型別是Map<String, Object>。
因此,靜態分析工具(Dart 分析器和 Dart 編譯器)只知道靜態(在編譯時已知)型別myMap['list']是 ,Object?即使實際運行時型別是List<int>。因此,嘗試直接訪問其上的List方法將是編譯時錯誤,因為List在任意Object位置上呼叫方法可能是不安全的。
您必須顯式轉換值 ( myMap['list'] as List<int>) 或通過顯式宣告myMap為 type 來禁用靜態型別檢查Map<String, dynamic>。
uj5u.com熱心網友回復:
3 是值型別,而不是物件型別。所以屬性“長度”不是在值型別上定義的。即使您定義了元素 'list' 來獲取長度,它也不知道如何處理它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/398567.html
標籤:镖
上一篇:資料幀Spark的轉換
