Dart中如何判断一个类型是否为另一个类型的子类型
问题原因
你代码中TimeRecord is Record返回false的核心原因是:Dart中的is运算符用于判断实例对象是否属于指定类型,而TimeRecord本身是Type类型的元数据对象,不是Record类的实例,该判断本质是在验证「Type类型的对象是否符合Record类型约束」,自然返回false。
额外注意:Dart SDK内置了同名的Record类型(用于实现元组功能),如果你的代码没有做库隔离,还可能存在命名冲突问题,建议自定义类更换名称避免歧义。
正确实现方式
分两种使用场景适配不同需求:
场景1:类型在编译期可知、或可以拿到子类实例
- 如果有子类实例,直接用实例做
is判断即可:
print(TimeRecord() is Record); // 输出true
- 如果要在编译期判断两个固定类型的子类型关系,可以用泛型辅助函数实现,该方案无额外运行时开销,全平台兼容,是最推荐的实现方式:
// 利用List泛型的协变特性判断子类型关系 bool isSubtype<S, T>() => <S>[] is List<T>; // 调用示例 void test() { print(isSubtype<TimeRecord, Record>()); // 输出true }
场景2:两个类型都是运行时获取的Type变量
如果类型是运行时动态获取的Type对象,无法在编码时确定泛型参数,可以用dart:mirrors反射库实现,注意该方案仅支持Dart原生环境,Flutter环境默认禁用反射无法使用:
import 'dart:mirrors'; bool isSubtypeRuntime(Type subType, Type superType) { final subMirror = reflectType(subType); final superMirror = reflectType(superType); return subMirror.isSubtypeOf(superMirror); } // 调用示例 void test() { print(isSubtypeRuntime(TimeRecord, Record)); // 输出true }
内容的提问来源于stack exchange,提问作者Ndimah
相关产品推荐
相关产品推荐

