Generics 泛型类型从num扩展到double的问题
我有一个关于dart中泛型的问题。我有下面的dart代码,带有一个扩展num的泛型类型参数。在我的类中,我现在想定义一个值为零的T类型变量。这似乎是不可能的。谁能解释一下为什么会这样Generics 泛型类型从num扩展到double的问题,generics,dart,Generics,Dart,我有一个关于dart中泛型的问题。我有下面的dart代码,带有一个扩展num的泛型类型参数。在我的类中,我现在想定义一个值为零的T类型变量。这似乎是不可能的。谁能解释一下为什么会这样 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 } 那么我该如何解决这个问题呢
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
}
那么我该如何解决这个问题呢?是否在我的构造函数中真正执行类型检查并根据T的类型生成0或0.0的列表的唯一选项?使用实际的双0.0,而不是0。最简单的修复方法是向构造函数添加一个零值。诸如此类:
class A<T extends num> {
final T zero;
A(this.zero) : assert(zero != null) {
var list = List<T>.filled(10, zero);
}
}
A类{
最终t0;
A(this.zero):断言(zero!=null){
var list=list.filled(10,零);
}
}
没有一个简单的表达式可以根据运行时T
绑定的内容计算为0
或0.0
。Dart中表达式的类型在编译时确定,在运行时之前您不知道t
的实际类型
您可以做的是:
T=0.0是T吗?(0.0作为T):(0作为T);
如果有人创建了一个T
,那么其中一个类型转换将抛出,这可能就是您想要的
如果有类型为T
的任何其他值,则可以执行以下操作:
A类{
T;
A(T someValue):T=(someValue*0)作为T;
}
通常,Dart泛型(类型参数)适用于泛型处理类型参数类型值的类,与类型参数无关。您在这里尝试的是类型专门化,而不是类型泛型,这就是为什么您没有语言支持它的原因
您可能最好创建
ANum
、AInt
和ADouble
类,并创建您想要的类-这样您就不必担心A
(或A
预空安全)。这对double有效,但我在A()上得到了错误
因为类型“double”不是类型转换中类型“int”的子类型
。我想要一个不管T的实际类型如何都能工作的通用解决方案。我们还没有联合类型,所以您现在必须考虑“强而可靠”。0作为double
对Dart VM不起作用,因为int
不能强制转换为double
<代码>双x=0代码>不涉及任何类型转换;该语言将其视为double x=0.0的语法糖代码>,这就是它仅适用于整数文本的原因。我认为您需要显式地检查T
。
double x = 0;
class A<T extends num> {
final T zero;
A(this.zero) : assert(zero != null) {
var list = List<T>.filled(10, zero);
}
}