You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:27:01