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

如何在Dart中编写参数可空时返回可空的泛型函数

解决方案

完全可以实现这种参数与返回类型的可空性联动,核心是用带可空约束的泛型参数让Dart自动推导返回值的可空状态。

重写后的泛型函数

R intToString<T extends int?, R extends String?>(T value) {
  if (value == null) {
    return null as R;
  }
  return value.toString() as R;
}

实际调用效果

调用时Dart会根据传入参数的可空性自动推导返回类型,无需手动指定泛型:

void main() {
  // 传入非可空int,返回非可空String
  String nonNullableStr = intToString(456);
  print(nonNullableStr.length); // 正常编译,无空安全警告

  // 传入可空int?,返回可空String?
  int? nullableInt = null;
  String? nullableStr = intToString(nullableInt);
  print(nullableStr?.length); // 必须处理空安全,否则编译报错
}

实现原理

  • 泛型T约束为int?,同时兼容非可空int和可空int?;
  • 泛型R约束为String?,对应返回值的可空状态;
  • Dart的类型推导机制会自动关联T和R的可空性:当T是int(非可空)时,R被推导为String;当T是int?时,R被推导为String?;
  • 代码里的as R是安全的类型转换,因为我们的逻辑保证了返回值类型与推导的R完全匹配。

更简洁的写法(利用Dart条件类型)

如果使用Dart 2.12及以上版本,还可以用条件类型进一步简化,无需显式声明返回值泛型:

T extends int ? String : String? intToString<T extends int?>(T value) {
  if (value == null) return null;
  return value.toString();
}

这种写法更直观,直接通过条件类型关联参数和返回值的可空性。


内容的提问来源于stack exchange,提问作者Mr. Clear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:56:01