Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 泛型类型从num扩展到double的问题_Generics_Dart - Fatal编程技术网

Generics 泛型类型从num扩展到double的问题

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 } 那么我该如何解决这个问题呢

我有一个关于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 
}

那么我该如何解决这个问题呢?是否在我的构造函数中真正执行类型检查并根据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);
  }
}