Dart泛型函数类型T检查失败,如何正确判断泛型类型?
Dart泛型类型匹配失败的原因与解决方法
问题原因
你代码里的类型判断逻辑存在错误:泛型参数T在运行时是一个Type类型的对象,而T is ClockData是在判断这个Type实例是否属于ClockData类的实例——这显然不成立,Type和ClockData是完全不同的类型,所以无论传入什么类型,这个判断都会返回false。
正确实现方式
要判断泛型参数对应的类型是否为目标类型,直接用==比较T和目标类型的Type对象即可:
int _getCollection<T>() { print(T); print(T == ClockData); // 调用_getCollection<ClockData>()时会返回true if (T == ClockData) { return 1; } else if (T == UserData) { return 2; } else { throw Exception("不支持的类型: $T"); } }
扩展:支持子类匹配
如果需要支持子类的类型匹配(比如传入ClockData的子类也希望返回1),可以添加一个可选的实例参数,通过实例来做类型判断:
int _getCollection<T>([T? instance]) { // 优先通过实例判断,支持子类 if (instance is ClockData) { return 1; } else if (instance is UserData) { return 2; } // 处理无实例但明确指定泛型类型的场景 else if (T == ClockData) { return 1; } else if (T == UserData) { return 2; } else { throw Exception("不支持的类型: $T"); } }
内容的提问来源于stack exchange,提问作者Preem Palver2
相关产品推荐
相关产品推荐

