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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:07:43