首页 > 解决方案 > “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);
}

标签: flutterdartgenericsmethodstypes

解决方案


这里的问题是 Dart 2.12.0 中引入的 Dart 新的 Null Safety 功能从语言中删除了隐式向下转换。

如果res具有类型Twhere T extends num,则操作res + something具有静态类型num。我们唯一知道T的是它实现numnum.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.


推荐阅读