如何在Dart中实现泛型类型的方法调用?
在Dart中实现泛型类型的实例创建(类似Swift的泛型协议调用)
在Dart中你遇到的问题核心有两个:一是泛型类型参数T在函数内部实际是Type类的实例,而非具体的类类型,所以无法直接调用T.createOne();二是你原代码中createOne定义为实例方法,逻辑上矛盾——创建新实例却需要先有一个已存在的实例来调用方法。
下面给出几种适配Dart特性的解决方案,你可以根据项目场景选择:
方案1:类型注册器(无反射,推荐Flutter项目使用)
这种方式不依赖反射,性能稳定且符合Flutter的编译限制,是生产环境的首选:
abstract class SomeGeneric { void doSomething(); } class Foo extends SomeGeneric { Foo(); // 将createOne改为静态方法,返回具体子类类型 static Foo createOne() { return Foo(); } @override void doSomething() { print("Hey this is fooooo"); } } class Bar extends SomeGeneric { Bar(); static Bar createOne() { return Bar(); } @override void doSomething() { print("Hey this is barrrrr"); } } // 维护类型与创建函数的映射表 final _typeCreators = <Type, T Function() forSome T extends SomeGeneric>{ Foo: Foo.createOne, Bar: Bar.createOne, }; T create<T extends SomeGeneric>() { final creator = _typeCreators[T] as T Function(); if (creator == null) { throw ArgumentError("No creator registered for type ${T.toString()}"); } return creator(); }
调用方式和你的Swift代码完全一致:
void main() { final foo = create<Foo>(); final bar = create<Bar>(); foo.doSomething(); // 输出 Hey this is fooooo bar.doSomething(); // 输出 Hey this is barrrrr }
方案2:dart:mirrors反射(仅非Flutter项目可用)
如果你不在Flutter环境中,可以用Dart的反射库实现最接近Swift的写法,但注意反射会带来性能开销:
import 'dart:mirrors'; abstract class SomeGeneric { void doSomething(); } class Foo extends SomeGeneric { Foo(); static Foo createOne() { return Foo(); } @override void doSomething() { print("Hey this is fooooo"); } } class Bar extends SomeGeneric { Bar(); static Bar createOne() { return Bar(); } @override void doSomething() { print("Hey this is barrrrr"); } } T create<T extends SomeGeneric>() { // 获取类型的镜像对象 final classMirror = reflectType(T) as ClassMirror; // 调用静态方法createOne并返回实例 final instance = classMirror.invoke(#createOne, []).reflectee as T; return instance; }
调用方式同样简洁:
void main() { final foo = create<Foo>(); final bar = create<Bar>(); foo.doSomething(); bar.doSomething(); }
方案3:传递创建函数(轻量直接方案)
如果不想维护注册表或使用反射,也可以直接给create函数传入创建器,这是最直观的轻量方案:
abstract class SomeGeneric { void doSomething(); } class Foo extends SomeGeneric { Foo(); static Foo createOne() { return Foo(); } @override void doSomething() { print("Hey this is fooooo"); } } class Bar extends SomeGeneric { Bar(); static Bar createOne() { return Bar(); } @override void doSomething() { print("Hey this is barrrrr"); } } // 接收返回T类型的创建函数作为参数 T create<T extends SomeGeneric>(T Function() creator) { return creator(); }
调用时传入对应类型的创建方法:
void main() { final foo = create(Foo.createOne); final bar = create(Bar.createOne); foo.doSomething(); bar.doSomething(); }
内容的提问来源于stack exchange,提问作者Johnykutty
相关产品推荐
相关产品推荐

