Dart实现带高阶泛型参数的工厂类是否需要代码生成?
结论
你需要的高阶类型(Higher Kinded Types)特性目前Dart正式版暂不支持,无法直接实现你示例中类级别泛型参数携带未确定参数类型的写法,无需代码生成的前提下,可以通过以下两种方案实现等效需求。
方案1:抽象工厂子类实现(完全类型安全,无运行时开销)
该方案通过将泛型参数下沉到方法层面,为每个SomeClass的派生类单独实现工厂子类,全程编译期类型检查,无额外运行时成本。
示例代码如下:
// 首先定义你的基础泛型类 abstract class SomeClass<A> { final A value; SomeClass(this.value); } // 示例:具体的派生类 class ConcreteSomeClass<A> extends SomeClass<A> { ConcreteSomeClass(super.value); } // 抽象工厂基类 abstract class Factory<T extends SomeClass> { T newInstance<A>(A arg); T<String> newString(String arg) => newInstance(arg); T<int> newInt(int arg) => newInstance(arg); } // 针对具体派生类的工厂实现 class ConcreteSomeClassFactory extends Factory<ConcreteSomeClass> { @override ConcreteSomeClass<A> newInstance<A>(A arg) => ConcreteSomeClass(arg); } // 使用示例 void main() { final factory = ConcreteSomeClassFactory(); final stringInstance = factory.newString("测试内容"); final intInstance = factory.newInt(123); print(stringInstance.value); // 输出:测试内容 print(intInstance.value); // 输出:123 }
适用场景:需要工厂生成的SomeClass派生类数量较少,对类型安全要求高的场景。
方案2:通用工厂函数封装(无需重复实现子类)
该方案通过将构造器逻辑作为泛型函数传入工厂类,不需要为每个派生类单独写工厂子类,仅在调用时指定返回类型即可。
示例代码如下:
abstract class SomeClass<A> { final A value; SomeClass(this.value); } class ConcreteSomeClass<A> extends SomeClass<A> { ConcreteSomeClass(super.value); } class Factory { final T Function<T extends SomeClass<A>, A>(A arg) _constructor; Factory(this._constructor); T newInstance<T extends SomeClass<A>, A>(A arg) => _constructor<T, A>(arg); T newString<T extends SomeClass<String>>(String arg) => _constructor<T, String>(arg); T newInt<T extends SomeClass<int>>(int arg) => _constructor<T, int>(arg); } // 使用示例 void main() { final factory = Factory(<T extends SomeClass<A>, A>(A arg) => ConcreteSomeClass(arg) as T); final stringInstance = factory.newString<ConcreteSomeClass<String>>("测试内容"); final intInstance = factory.newInt<ConcreteSomeClass<int>>(123); print(stringInstance.value); // 输出:测试内容 print(intInstance.value); // 输出:123 }
注意:示例中的
as T为Dart类型推断限制所需,只要传入的构造器逻辑正确,运行时不会有类型错误。
适用场景:需要支持大量SomeClass派生类,不想手写重复工厂子类的场景。
目前高阶类型特性还在Dart语言的讨论迭代阶段,暂未确定正式上线时间,若你需要支持的派生类数量极多,也可以通过代码生成的方式自动生成各派生类对应的工厂子类,减少手写重复代码的工作量。
内容的提问来源于stack exchange,提问作者Marvin H.
相关产品推荐
相关产品推荐

