Dart中Map对象runtimeType返回不符预期的问题及解决求助
问题解答
一、Map的runtimeType返回具体实现类的原因
Dart里的Map是抽象类,你用{}创建的实例其实是Dart内部默认的具体实现类_InternalLinkedHashMap<dynamic, dynamic>,这属于正常设计:
is关键字判断的是对象是否属于某个抽象类/接口的实现,所以{} is Map返回true——因为_InternalLinkedHashMap实现了Map接口runtimeType返回的是对象的实际具体类型,所以{}.runtimeType == Map自然是false,毕竟一个是具体实现类,一个是抽象父类
类似的,List也是抽象类,你用[]创建的实例实际类型是_GrowableList<dynamic>,你例子里的[].runtimeType == List其实是false,应该是测试时的疏忽。
二、用Type变量做类型判断的解决方案
Dart的is运算符要求右侧是编译期确定的类型字面量,不能是运行时的Type变量,所以直接写'foo' is t会报错。有两种可行的解决思路:
1. 用runtimeType直接比较
如果不需要考虑继承关系(只判断对象的实际类型是否和目标类型完全一致),可以直接对比runtimeType:
Type t = String; bool b = 'foo'.runtimeType == t; // true
注意:这种方式不支持子类判断,比如int是num的子类,1.runtimeType == num会返回false。
2. 构建类型判断函数映射表
如果需要支持继承/接口判断(完全模拟is的行为),可以预先创建一个类型与判断函数的映射表,适合大规模Schema验证场景:
final typeCheckers = <Type, bool Function(dynamic)>{ String: (value) => value is String, int: (value) => value is int, Map: (value) => value is Map, List: (value) => value is List, // 可继续添加需要验证的类型 }; // 使用示例 Type t = String; bool b = typeCheckers[t]!('foo'); // true Type t2 = Map; bool b2 = typeCheckers[t2]!({}); // true
内容的提问来源于stack exchange,提问作者ubiquibacon
相关产品推荐
相关产品推荐

