flutter - “num”类型的值不能分配给“T”类型的变量
问题描述
你好,当我使用这个通用方法时,我得到了这个错误
“num”类型的值不能分配给“T”类型的变量。尝试更改变量的类型,或将右手类型转换为“T”。
这里有什么错误
sums<T extends num>(List<T> list) {
T res =list[0];
for (var i = 1; i < list.length; i++) {
res = res + list[i];
}
print(res);
}
解决方案
这里的问题是 Dart 2.12.0 中引入的 Dart 新的 Null Safety 功能从语言中删除了隐式向下转换。
如果res
具有类型T
where T extends num
,则操作res + something
具有静态类型num。我们唯一知道T
的是它实现num
并num.operator+
返回num
。但是,num
不可分配给,T extends num
因为后者是前者的子类型(T
可能是int
,并非所有num
值都可分配给int
)。因此,您需要显式强制转换以使分配有效:
res = (res + list[i]) as T;
就是这样的演员。如果你只写res = res + list[i] as T;
, 的优先级as
意味着它与上面的演员阵容相同。在 Dart 2.10.x 中,它在没有显式转换的情况下工作,因为该语言为您插入了一个隐式转换。
如果您改为编写res += list[i] as T;
它,则意味着res = res + (list[i] as T);
which 是不必要的转换,因为list[i]
已经具有 type T
,并且不会转换加法的结果。
这不会一直失败的原因int res = ...; res = res + otherInt;
是语言规范特别对待int.operator+
(以及一些类似的整数运算符)并识别结果何时为整数,即使+
运算符的返回类型是num
. 这种特殊情况不适用于T extends num
.
推荐阅读
- r - 如何在 r 中导入排列好的 .csv 文件
- python - 如何使用我正在使用的代码使球从绘制的矩形上反弹?
- angular - 'Could not resolve module... relative to...' 编译应用程序时出错
- python - 用我自己的操作系统刷新我的旧捕获盒
- java - 似乎无法将 int 转换为字符串并运行我的程序,因此它输出 330
- python-3.x - 内存问题?如何有效地获得所需的输出?
- php - Laravel 5.8 自定义表单请求未按预期工作?
- ruby-on-rails - 如何根据创建的对象字段值测试是否发送邮件
- c# - 使用 linq 过滤器选择父母和一些孩子
- swift - kitura中可编码路线中的多个参数