如何检查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
相关产品推荐
相关产品推荐

