最小可复制代码:
void main() {
print(foo<int>('1'));
print(foo<double>('1.0'));
print(foo<double>('1'));
print(foo<int>('1.0'));
}
T foo<T extends num>(String s) {
final res = num.parse(s);
return (T == double ? res.toDouble() : res.toInt()) as T;
}
正如你所看到的,我正在手动处理类型。有没有更好的方法来做这件事?
1条答案
按热度按时间zzlelutf1#
我看不出有什么更好的解决方案。你有一个完全基于类型参数来改变行为的函数。因为你对类型参数所能做的就是子类型检查,或者把它与常量类型文本进行比较,所以你需要做类似的事情。
我更喜欢子类型检查,因为它也允许升级,但是对于像
T
只有四种可能类型的情况,检查Type
对象是否相等也可以工作,在返回之前至少需要有一个as T
。这两种方法都 * 仅 * 适用于有限的类型层次结构,并且您考虑了所有可能的类型。即使在这里,当前代码也没有覆盖
<num>
和<Never>
,这两个参数对于绑定的num
也是有效的类型参数。因此,请保持警惕。也许,使用子类型检查升级:
或者.使用
Type
对象等式: