You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:12:33