Flutter 无法将动态向下转换为列表<;int>;在地图上使用时

Flutter 无法将动态向下转换为列表<;int>;在地图上使用时,flutter,dart,Flutter,Dart,让我们从以下几点开始: dynamic list = [1]; var ints = list as List<int>; // Works 这次我正在做同样的事情,list属于dynamic类型,我正在将其向下转换为list,但是失败了,出现了一个错误: 'List'不是类型转换中类型'List'的子类型 谁能告诉我为什么第一个代码有效,而第二个失败 注意:我不是在寻找如何使第二个代码工作的解决方案,我知道如何做到这一点。问题是,第一个代码动态可以降级到列表,但第二个代码不能降

让我们从以下几点开始:

dynamic list = [1];
var ints = list as List<int>; // Works
这次我正在做同样的事情,
list
属于
dynamic
类型,我正在将其向下转换为
list
,但是失败了,出现了一个错误:

'List'
不是类型转换中类型
'List'
的子类型

谁能告诉我为什么第一个代码有效,而第二个失败



注意:我不是在寻找如何使第二个代码工作的解决方案,我知道如何做到这一点。问题是,第一个代码
动态
可以降级到
列表
,但第二个代码不能降级。为什么会这样?

尝试通过打印runtimeType来查看您得到的类型

dynamic list = [1];
print(list.runtimeType);
var ints = list as List<int>; // Works
动态列表=[1];
打印(list.runtimeType);
var ints=以列表形式列出;//作品

var jsonString='{“0”:[1]}';
var-Map-Map=jsonDecode(jsonString);
动态列表=映射['0'];
打印(list.runtimeType);
var ints=以列表形式列出;//失败
但这可能与
[1]
被识别为
列表有关,显然可以将其转换为
列表。但是因为您的地图是
,所以它可以是
地图['0']
中的任何类型,并且不能强制转换

通过使用
List.from()

List ints=List.from(map['0'])


尝试通过打印runtimeType来查看您得到的类型

dynamic list = [1];
print(list.runtimeType);
var ints = list as List<int>; // Works
动态列表=[1];
打印(list.runtimeType);
var ints=以列表形式列出;//作品

var jsonString='{“0”:[1]}';
var-Map-Map=jsonDecode(jsonString);
动态列表=映射['0'];
打印(list.runtimeType);
var ints=以列表形式列出;//失败
但这可能与
[1]
被识别为
列表有关,显然可以将其转换为
列表。但是因为您的地图是
,所以它可以是
地图['0']
中的任何类型,并且不能强制转换

通过使用
List.from()

List ints=List.from(map['0'])

谁能告诉我为什么第一个代码有效,而第二个失败

第一个代码,您已经有了一个
列表
(或者可能有一个实现
列表
JsArray
)。所以打字很有效

第二个代码,您没有
列表
。您有一个实现
列表的
JsArray
。但不能将其类型转换到
列表中。因为事实并非如此

如果你想知道为什么
列表
不是
列表
,可以这样想:动物列表不是狼列表。里面也可能有羊。如果你想要一个狼群列表,你必须转换原始列表,而不仅仅是打字

谁能告诉我为什么第一个代码有效,而第二个失败

第一个代码,您已经有了一个
列表
(或者可能有一个实现
列表
JsArray
)。所以打字很有效

第二个代码,您没有
列表
。您有一个实现
列表的
JsArray
。但不能将其类型转换到
列表中。因为事实并非如此


如果你想知道为什么
列表
不是
列表
,可以这样想:动物列表不是狼列表。里面也可能有羊。如果你想要一个狼的列表,你必须转换原始列表,而不仅仅是键入它。

如果我对答案投了否决票,我肯定希望那些用户也会对这篇文章投否决票。但是如果你是其中一个没有回答并投反对票的人,我很想听听你投反对票的原因。如果我投反对票,我当然希望那些用户也会投反对票。但是如果你是其中一个没有回答并投反对票的人,我很想听听你投反对票的原因。@iLoveDocs我在我的答案中添加了
,因为你的地图可以是地图['0']中的任何类型,并且不能被铸造
,这就是为什么我在第二个代码中为
列表
使用
动态
,在第一个代码中也是如此。一个符合
列表的条件,另一个不符合,这就是问题所在@伊洛维多克这是我的猜测。我发现了一个关于dart github的讨论,它可能对我在回答中添加的@iLoveDocs很感兴趣
,因为你的地图可以是地图['0']中的任何类型,并且不能进行铸造
,这就是为什么我在第二个代码中为
列表
使用
动态
类型,在第一个代码中我也是如此。一个符合
列表的条件,另一个不符合,这就是问题所在@伊洛维多克这是我的猜测。我发现一个关于dart github的关于铸造的讨论可能很有趣
var jsonString = '{"0": [1]}';
var Map<String, dynamic> map = jsonDecode(jsonString);
dynamic list = map['0'];
print(list.runtimeType);
var ints = list as List<int>; // Fails