Dart中如何为Type类型变量设置可用类型的约束限制?
Dart实现Type类型泛型约束的方案
Dart的Type类型本身不携带泛型参数信息,因此无法直接实现Type<T>的语法,但可以通过泛型参数上界约束实现你的需求,编译期即可拦截不符合要求的类型传入,无需等待运行时报错。
最优实现方案(编译期校验)
不需要显式传入Type实例,直接通过泛型参数绑定类型信息,依托泛型的上界约束做编译期校验:
// 你的Element基类 abstract class Element {} // 示例Element子类 class ClassThatExtendsElement extends Element {} // 测试用全局元素列表 final List<Element> elements = [ ClassThatExtendsElement(), ClassThatExtendsElement(), ]; class ElementFilter<T extends Element> { // 直接从泛型参数获取运行时Type Type get elementType => T; const ElementFilter(); } List<T> filterElements<T extends Element>(ElementFilter<T> filter) { // 直接用Dart内置的whereType做类型过滤,无需自定义类型判断逻辑 return elements.whereType<T>().toList(); } // 调用示例 void main() { // 编译正常,运行符合预期 final result = filterElements(ElementFilter<ClassThatExtendsElement>()); // 编译直接报错:类型String不符合ElementFilter的泛型上界Element约束 // filterElements(ElementFilter<String>()); }
兼容类型字面量传入的方案(运行时校验)
如果你一定要保留ElementFilter(ClassThatExtendsElement)这种传类型字面量的写法,只能做运行时校验,编译期无法提前拦截错误:
class ElementFilter<T extends Element> { final Type elementType; ElementFilter(this.elementType) { // 运行时校验传入类型是否继承自Element if (!elementType.isSubtypeOf(Element)) { throw ArgumentError.value(elementType, 'elementType', '必须继承自Element'); } } }
内容的提问来源于stack exchange,提问作者GusHill
相关产品推荐
相关产品推荐

