如何在Dart中通过变量以编程方式传递泛型类型?
在Dart中通过变量编程式传递泛型类型的实现方案
Dart的泛型参数是编译时确定的,而runtimeType是运行时才能获取的类型信息,因此无法直接写出Foo<bla.runtimeType>(bla)这种语法。不过可以通过运行时类型判断的方式间接实现你的需求,以下是具体方案:
方案一:手动类型判断指定泛型
既然你能确保bla的类型是A或B,可以通过is关键字做类型检查,分别创建对应泛型的Foo实例:
class A {} class B {} final dynamic bla = A(); // 实际为A或B类型 class Foo<T> { const Foo(this.bla) : assert(T == A || T == B); // 修正原断言写法,确保逻辑正确 final T bla; } // 创建实例 final Foo foo; if (bla is A) { foo = Foo<A>(bla); } else if (bla is B) { foo = Foo<B>(bla); } else { throw ArgumentError('bla的类型必须是A或B'); }
这样泛型参数T会被明确指定为A或B,与bla的实际类型匹配,不会触发断言错误。
方案二:用工厂构造函数封装逻辑
如果需要多次创建实例,可以将类型判断逻辑封装到Foo类的工厂构造函数中,简化调用:
class A {} class B {} class Foo<T> { const Foo(this.bla) : assert(T == A || T == B); final T bla; // 工厂构造函数处理动态类型转换 factory Foo.fromDynamic(dynamic bla) { if (bla is A) { return Foo<A>(bla); } else if (bla is B) { return Foo<B>(bla); } throw ArgumentError('bla的类型必须是A或B'); } } // 使用方式 final dynamic bla = B(); final Foo foo = Foo.fromDynamic(bla);
为什么直接使用runtimeType不可行?
Dart属于静态类型语言,泛型参数在编译阶段就需要确定具体类型,而bla.runtimeType是运行时才能获取的对象实例,编译器无法在编译时将其解析为有效的类型参数,因此直接写Foo<bla.runtimeType>(bla)会触发语法错误。
内容的提问来源于stack exchange,提问作者nafsaka
相关产品推荐
相关产品推荐

