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
相关产品推荐
相关产品推荐

