如何在Dart中创建元素为同泛型类但泛型参数不同的列表?
解决Dart泛型列表的类型不匹配问题
你遇到的类型错误,本质是Dart泛型函数的逆变特性导致的:当你声明List<Foo>时,Dart会默认将其推断为List<Foo<dynamic, dynamic>>,但你的func是bool Function(U)类型,bool Function(Bar)无法直接兼容bool Function(dynamic)——后者要求能接受任意dynamic参数,而前者仅接受Bar类型,类型约束更严格,因此出现类型不匹配异常。
针对你的场景,有两种可行的解决方案:
方案一:统一约束泛型参数U
因为你的示例中所有Foo实例的U参数都是Bar,可以直接将列表类型声明为List<Foo<dynamic, Bar>>,这样既允许T是任意类型,又保证func的类型和func1、func2完全匹配:
void main() { List<Foo<dynamic, Bar>> list = [ Foo(arg: "hello", func: func1), Foo(arg: 100, func: func2), ]; }
方案二:定义无泛型基类(支持U为不同类型)
如果后续需要在列表中加入U为其他类型的Foo实例,可以先定义一个无泛型的基类,让Foo继承它,再用基类作为列表的元素类型:
abstract class BaseFoo {} class Foo<T, U> extends BaseFoo { final T arg; final bool Function(U) func; const Foo({ required this.arg, required this.func }); } void main() { List<BaseFoo> list = [ Foo(arg: "hello", func: func1), Foo(arg: 100, func: func2), // 可以加入U为其他类型的Foo实例 Foo(arg: true, func: (String s) => s.isNotEmpty), ]; }
注意:使用这种方式时,直接访问列表元素的arg和func需要先做类型检查(比如is Foo判断),否则无法调用泛型成员。
内容的提问来源于stack exchange,提问作者KevinF
相关产品推荐
相关产品推荐

