Dart中List<int>变量传入List<double>参数出现类型错误的原因?
问题原因
这个差异是Dart的上下文类型推断规则导致的,两种写法的列表字面量被推断出的类型完全不同:
- 直接传入
sum([1, 3, 4, 6])时,sum函数要求的参数类型是List<double>,这个上下文会作用到列表字面量上,Dart会自动把字面量里的int元素推断为double类型,最终这个列表的类型是List<double>,所以调用合法。 - 单独写
var test = [1, 3, 4, 6];时,没有外部上下文约束,Dart会直接根据字面量里的元素都是int,把test变量推断为List<int>类型,而Dart里List<int>和List<double>是完全独立的泛型类型,不存在子类型关系,所以把List<int>传给要求List<double>的参数就会报错。
解决方案
你可以根据需求任选一种方案解决:
- 给sum函数用泛型适配所有数字类型,同时支持int和double输入:
double sum<T extends num>(List<T> elements) { double el = 0.0; for (var elem in elements) { el += elem.toDouble(); } return el; }
- 声明test变量时指定类型为
List<double>,让Dart自动转换元素类型:
List<double> test = [1, 3, 4, 6]; var sm = sum(test); // 调用正常
- 调用sum时将test转换为
List<double>类型:
var test = [1, 3, 4, 6]; var sm = sum(test.map((e) => e.toDouble()).toList());
- 高版本Dart也可以借助扩展操作符触发上下文类型推断:
var test = [1, 3, 4, 6]; var sm = sum([...test]);
内容的提问来源于stack exchange,提问作者Aissam Ma
相关产品推荐
相关产品推荐

