Dart中如何避免泛型类定义时重复指定子泛型类型
解决Dart泛型类重复指定子泛型的问题
方案1:利用Dart自动类型推断(最简单)
你的原始Test2定义不需要修改,实例化时不手动指定泛型参数,让编译器自动推导即可:
final maintTest = (){ const t1 = Test1<TestE>(TestE.oneCase); const t2 = Test2(t1); // 无需手动写<Test1<TestE>, TestE>,编译器自动推断 final TestE? result = t2.test(); return result; };
Dart的类型推断会根据t1的Test1<TestE>类型,自动确定Test2的泛型参数T=Test1<TestE>和E=TestE,完全消除冗余的类型声明。
方案2:调整Test2的泛型结构(贴近你的期望写法)
如果希望Test2的泛型只声明T,可以通过给Test1添加关联类型约束,让Test2从T中自动推导E:
// 定义一个抽象接口,约束持有Enum类型的结构 abstract class EnumHolder<E extends Enum> { E? get element; } class Test1<E extends Enum> implements EnumHolder<E> { const Test1(this.element); @override final E? element; } // 让T实现EnumHolder<E>,编译器会自动从T中推导E的类型 class Test2<T extends EnumHolder<E>, E extends Enum> { const Test2(this.tester); final T tester; E? test() { return tester.element; } }
实例化时可以仅指定T,无需重复声明E:
const t2 = Test2<Test1<TestE>>(t1); // 只指定T,E由编译器自动推导
方案3:使用typedef简化泛型声明
如果需要频繁使用Test1<TestE>这类组合类型,可用typedef封装:
typedef Test1TestE = Test1<TestE>; class Test2<T extends Test1<E>, E extends Enum> { const Test2(this.tester); final T tester; E? test() => tester.element; } // 实例化时用别名替代长泛型 const t2 = Test2<Test1TestE>(t1);
注意
Dart目前不支持T.E这种直接提取泛型子参数的语法,因为Dart泛型是擦除式的,运行时无法直接获取泛型参数的子类型,只能通过编译期类型推断或显式约束实现类似效果。
内容的提问来源于stack exchange,提问作者EvGeniy Ilyin
相关产品推荐
相关产品推荐

