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

