首页 > 解决方案 > 从 num 扩展的泛型类型和从 int 到 double 类型转换的问题

问题描述

我对飞镖中的泛型有疑问。我有以下带有泛型类型参数的飞镖代码,它扩展了 num。在我的班级中,我现在想定义一个类型为 T 且值为 0 的变量。这似乎是不可能的。谁能解释我为什么会这样?

class A<T extends num> {
  T t = 0; // error: A value of type 'int' can't be assigned to a variable of type 'T'.
  num n = 0; // works 
}

我面临的问题是我想在我的类中创建一个用零初始化的列表。所以我可以这样做:

A() {
 var list = List<T>.filled(10, 0 as T)
}

适用于A<int>()但失败A<double>()并显示错误消息

类型“int”不是类型转换中“double”类型的子类型

什么令人困惑,因为从 Dart 2.1 开始,可以将 int 传递给 double 变量,例如:

double x = 0;

那么我该如何解决呢?唯一的选择真的是在我的构造函数中进行类型检查并根据 T 的类型生成 0 或 0.0 的列表吗?

标签: genericsdart

解决方案


没有简单的表达式可以根据运行时绑定的内容00.0基于其进行评估。TDart 中表达式的类型是在编译时确定的,在运行时你不知道它的实际类型T

你可以做的是:

T t = 0.0 is T ? (0.0 as T) : (0 as T);

如果有人设法创建一个T<Never>,那么其中一个演员会抛出,这可能是你想要的。

如果您有任何其他类型的值T,那么您可以执行以下操作:

class A<T extends num> {
  T t;
  A(T someValue) : t = (someValue * 0) as T;
}

通常,Dart 泛型(类型参数)适用于一般处理类型参数类型值的类与类型参数是什么无关。您在这里尝试做的是type specialization,而不是 type generic,这就是您没有语言支持的原因。

你可能会更好地制作ANum,AIntADouble类并创建你想要的 - 然后你也不必担心A<Never>(或A<Null>前空安全)。


推荐阅读