在Dart泛型中,应优先使用dynamic还是Object??
Dart strict-raw-types规则下的泛型参数选型困惑
我一直在尝试落实Dart的strict-raw-types规则,保证代码严格遵循类型系统。
我已经理清了变量层面dynamic和Object?的差异:
dynamic类似TypeScript的any,完全脱离类型系统,相当于“未知类型,允许任意操作”(因此我认为绝对不该使用);Object?类似Kotlin的Any,更合理的定位是“未知类型,禁止任意操作”(这种方式完全可行)。
但关于将这两种类型用作泛型参数时的具体含义,我找不到太多资料。我想要实现类似Kotlin中List<*>的效果,核心需求是:
- 该泛型有确定的实际类型
- 我不清楚具体是什么类型
- 禁止对其进行任意无类型校验的操作
我尝试了List<dynamic>和List<Object?>,二者表现似乎几乎一致,事实真的如此吗?
从List<dynamic>中取出元素时,其隐式类型是dynamic而非Object?,不过如果我尝试把它当作dynamic来做无限制操作会被linter拦截,所以问题不大,但这仍是我反感List<dynamic>的原因。另外我发现,向这两种列表添加元素时没有区别,都能接受任意类型的参数。
另一方面,写List<Object?>让我感觉别扭,因为这看起来像是在强制指定一种具体类型(就像在Kotlin中写List<Any>),这并不是我真正想要的——尤其是在不关心泛型具体类型的抽象框架代码里,因此我也不太倾向于这个选项。
对于追求严格类型规范的开发者,哪种方案是推荐的优先选择?有没有我没考虑到的其他选项?是否应该通过linter禁用其中一种?
场景示例
假设我有一个BoxDumper类,用于接收并存储任意类型的Box实例,且不会取出这些Box:
class BoxDumper { // 注意:我不想将其绑定到某个特定的T类型 final List<Box<*>> _dump; void take(Box<*> box) { _dump.add(box); } }
内容的提问来源于stack exchange,提问作者Luan Nico
相关产品推荐
相关产品推荐

