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

Dart:如何创建适配任意类型的通用扩展,使返回类型保留原类型参数

Dart:如何创建适配任意类型的通用扩展,使返回类型保留原类型参数

嘿,我懂你想要实现的效果——不用给每个类型单独写扩展,而是搞一个通用扩展,让返回的Foo能自动带上原类型的泛型参数对吧?你当前的写法之所以返回Foo<dynamic>,是因为扩展基于dynamic,编译器没法推断出调用者的具体类型,只能默认用dynamic。

其实只要把扩展改成泛型扩展就行,调整一下代码就能解决:

class Foo<T> {
  final T value;
  const Foo(this.value);
}

// 泛型扩展,T会自动绑定到调用者的实际类型
extension GenericFooExtension<T> on T {
  Foo<T> get foo => Foo<T>(this);
}

void main() {
  final doubleTest = 0.0.foo;
  final stringTest = "hello".foo;
  final intTest = 42.foo;
  
  print(doubleTest.runtimeType); // 输出:Foo<double>
  print(stringTest.runtimeType); // 输出:Foo<String>
  print(intTest.runtimeType); // 输出:Foo<int>
}

简单说下原理:

  • 把extension on dynamic改成extension GenericFooExtension<T> on T,这里的T会在调用时自动绑定成调用者的具体类型(比如double、String);
  • 此时返回的Foo<T>就会带着正确的泛型参数,而不是默认的dynamic了。

如果之后你想限制这个扩展只能给某些类型用(比如只允许num和String),还可以给泛型加约束:

extension GenericFooExtension<T extends num | String> on T {
  Foo<T> get foo => Foo<T>(this);
}

这样只有num和String类型的对象能调用.foo方法,其他类型会直接报错,灵活性拉满~

备注:内容来源于stack exchange,提问作者JakesMD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 15:13:14