Dart中如何正确初始化指定泛型的空LinkedHashMap?
错误原因
Dart 中未指定泛型的空 Map 字面量{},默认会创建_InternalLinkedHashMap<dynamic, dynamic>类型的实例,和你声明的LinkedHashMap<DateTime, List<Event>>类型不匹配:
- 直接赋值时静态类型检查就会报错,动态类型 Map 不能直接赋值给明确泛型的 Map 变量
- 用
as强制转换也会在运行时抛出错误,因为实例本身的运行时类型就是动态键值的 Map,不属于目标泛型类型,强转逻辑不成立。
正确初始化方法
根据使用场景选择对应写法即可:
- 普通场景(只需要默认按插入顺序排序的 LinkedHashMap,Dart 默认 Map 实现本身就是 LinkedHashMap),直接在 Map 字面量上显式声明泛型:
_map = <DateTime, List<Event>>{};
- 如果你引入了
dart:collection需要使用 LinkedHashMap 的自定义能力(比如自定义键相等判断、哈希值计算逻辑),直接调用 LinkedHashMap 的构造函数创建实例:
import 'dart:collection'; // 基础构造写法 _map = LinkedHashMap<DateTime, List<Event>>(); // 自定义键比较规则示例:将同一天的 DateTime 判定为同一个键 _map = LinkedHashMap<DateTime, List<Event>>( equals: (date1, date2) => date1.year == date2.year && date1.month == date2.month && date1.day == date2.day, hashCode: (date) => Object.hash(date.year, date.month, date.day), );
- 注意:不要对泛型不匹配的集合实例用
as强转,Dart 的泛型是固化的,运行时会保留泛型类型信息,类型不匹配的强转一定会触发运行时错误。
内容的提问来源于stack exchange,提问作者Carlos Garmon
相关产品推荐
相关产品推荐

