generics - 从 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 的列表吗?
解决方案
没有简单的表达式可以根据运行时绑定的内容0
或0.0
基于其进行评估。T
Dart 中表达式的类型是在编译时确定的,在运行时你不知道它的实际类型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
,AInt
和ADouble
类并创建你想要的 - 然后你也不必担心A<Never>
(或A<Null>
前空安全)。
推荐阅读
- java - Flink keyBy vs RichParallelSourceFunction
- sql-server - SSIS 包仅在目录中可能丢失数据
- javascript - vuejs中如何获取组件编译后的html内容
- r - 在R中绘制一系列圆圈
- react-native - 退出 React Native 应用程序时是否有要监听的事件?
- c++ - 检查两种类型是否可以别名
- survival-analysis - 按对子组的治疗效果分层的 Cox 回归森林图
- python - 将用空格分隔小数位的数字字符串的类型更改为 int/float
- python - 来自重采样方法与 scipy.stats.chi2_contigency 的卡方检验 P 值
- python - 我怎样才能分离一个元组?