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

使用重定向构造函数时如何使用类型参数?

问题原因

你写的代码报错,是因为Foo.zero()作为泛型类Foo<T>的命名构造函数,它默认和当前类的泛型参数T绑定,没法在初始化列表里给this._显式指定另一个泛型类型(比如int)。Dart的构造函数初始化列表不支持这种写法。

解决办法

把zero改成工厂构造函数就行,这样能直接返回指定泛型类型的实例,完全不用类型转换:

class Foo<T extends num> {
  final T t;
  Foo._(this.t);
  
  factory Foo.zero() {
    return Foo._<int>(0);
  }
}

现在调用Foo.zero()会直接得到Foo<int>类型的实例,完全符合你想直接用int类型参数的要求。

如果之后需要支持其他数字类型的零值,还可以给工厂构造函数加个带默认值的可选泛型参数:

class Foo<T extends num> {
  final T t;
  Foo._(this.t);
  
  factory Foo.zero<U extends num = int>() {
    return Foo._<U>(0 as U); // 这里的类型转换是安全的,因为U是num的子类,0是所有数字类型的合法零值
  }
}

// 调用示例
void main() {
  var intZero = Foo.zero(); // 默认生成Foo<int>实例
  var doubleZero = Foo.zero<double>(); // 显式生成Foo<double>实例
}

内容的提问来源于stack exchange,提问作者iDecode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:05:21