首页 > 解决方案 > 使用 num 的 int 和 double 上的抽象被新的 Dart 版本破坏

问题描述

以下代码用于在 Dart 2.6 中工作(非常简化的示例!):

T plus<T extends num>(T a, T b) => a + b;

现在它失败了:A value of type 'num' can't be returned from method 'plus' because it has a return type of 'T'.

有没有办法像示例中的意图那样抽象doubleint

标签: dart

解决方案


我假设您将--no-implicit-casts标志传递给分析器以获取此错误。该代码在当前的 Dart 语言中是正确的,但它包含一个隐式转换,因此如果您选择禁用它们,则该代码将不会被接受。

代码不起作用的原因是 is 的静态类型a + bnum两者都具有T仅知道可以扩展的类型num,因此它们被视为num,并num.operator+返回num),并且返回类型是Twhich may extend num

因此,如果您允许,代码会从numto进行隐式转换。T

要使代码即使在没有隐式转换的情况下也能编译,您必须将其转换为显式转换:

T plus<T extends num>(T a, T b) => (a + b) as T;

推荐阅读