Dart中传入double值给同类型参数却报类型不匹配错误
解决Dart中"The argument type 'double' can't be assigned to the parameter type 'double'"错误
问题根源
你在_runClassification方法的泛型声明里犯了一个关键错误:
Map<String, double> _runClassification<double>(List<double> found) { ... }
这里的<double>是泛型参数的名称,而非指定类型。这会直接覆盖Dart内置的double类型别名,导致方法内的List<double>实际上指代的是List<自定义泛型参数double>,而非原生的double数值类型。
当你从这个列表里取found[i]传入_aboveTreshold(double value)时,传入的是自定义泛型参数的实例,和函数要求的原生double类型本质上是两个不同的类型,所以才会出现这种看似矛盾的类型不匹配错误。
最优解决方案
直接移除_runClassification方法多余的泛型声明即可,因为这个方法根本不需要泛型支持:
Map<String, double> _runClassification(List<double> found) { final classification = <String, double>{}; for (int i = 0; i < found.length; i++) { if (_aboveTreshold(found[i])) { classification[_labels[i]] = found[i]; } } return classification; }
修改后,found会被正确识别为原生List<double>,found[i]就是标准的double类型,直接传入_aboveTreshold不会再有类型错误,也不需要任何强制类型转换。
为什么临时方案能运行?
你用泛型_aboveTreshold<T>的临时方案之所以能工作,是因为泛型参数T适配了被错误命名的泛型参数double,之后通过value as double强制转换成了原生double类型。但这种写法完全是绕远路,还存在类型转换失败的风险,完全没必要。
内容的提问来源于stack exchange,提问作者maerlyn
相关产品推荐
相关产品推荐

