为何API返回int值时,Dart的double类型无法直接接收?
为什么Dart中JSON反序列化时int不能直接赋值给double变量?
核心差异:编译期隐式转换 vs 运行时动态类型检查
你遇到的问题本质是字面量赋值的编译期处理和JSON反序列化后动态类型的运行时检查的区别:
- 当你写
double feels_like = 30;时,30是int字面量,Dart编译器会在编译阶段自动把它隐式转换为double类型的实例,这是语言针对字面量场景提供的语法糖。 - 但JSON解析后的结果是
Map<String, dynamic>,其中json['main']['feels_like']的静态类型是dynamic,运行时它的实际类型是int。Dart在运行时不会自动将动态类型的int实例转换为double实例——因为动态类型的类型校验是在运行时执行的,编译器无法提前介入做隐式转换。
Dart类型系统的本质要求
Dart是强类型语言,虽然int和double都是num的子类,但它们是同级的不同类型,不存在继承关系。当你声明final double feels_like时,这个变量的静态类型被固定为double,运行时必须存储double类型的实例,不能是int实例。
你可以自己验证这个逻辑:
dynamic value = 30; // 运行时类型是int double feels_like = value; // 同样会抛出 type 'int' is not a subtype of type 'double'
为什么toDouble()能解决问题
toDouble()是num类的方法,int作为num的子类实现了这个方法,会返回一个真正的double类型实例,这样赋值时类型就完全匹配了,不会触发异常。
内容的提问来源于stack exchange,提问作者A-E
相关产品推荐
相关产品推荐

