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

如何检查Dart方法的泛型类型T是否被显式指定

解决方案

要实现区分泛型类型是否被显式指定的需求,你可以利用Dart泛型的默认类型参数特性,定义一个私有标记类型作为默认值,以此判断用户是否显式指定了泛型类型:

// 定义私有标记类型,仅用于判断是否显式指定泛型
class _DefaultGenericMarker {}

void myFunction<T extends Object? = _DefaultGenericMarker>() {
  if (T == _DefaultGenericMarker) {
    print("T is not specified");
  } else {
    print("T is of type $T");
  }
}

// 测试示例
void main() {
  myFunction(); // 输出:T is not specified
  myFunction<int>(); // 输出:T is of type int
  myFunction<dynamic>(); // 输出:T is of type dynamic(显式指定dynamic属于指定类型)
  myFunction<Object?>(); // 输出:T is of type Object?(显式指定Object?属于指定类型)
}

原理说明

  • 当用户不显式指定泛型类型时,Dart编译器会自动使用我们设置的默认类型_DefaultGenericMarker,此时通过T == _DefaultGenericMarker可以判断出未指定泛型的情况。
  • 当用户显式指定任何类型(包括dynamic、Object?等),泛型参数T会被替换为用户指定的类型,此时条件不成立,执行对应逻辑。

这种方法避开了直接判断dynamic、Object?等类型的问题,因为这些类型可能被用户显式指定,而我们需要区分的是“是否主动指定”,而非具体类型是什么。

内容的提问来源于stack exchange,提问作者Ashutosh Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 11:43:15