当前位置: 首页 > 知识库问答 >
问题:

从 num 扩展到从 int 到双精度的泛型类型的问题

李锦
2023-03-14

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

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

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

这适用于< code>A

类型'int'不是类型转换中类型'Double'的子类型

令人困惑的是,从Dart 2.1开始,可以将int传递给双变量,例如:

double x = 0;

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

共有3个答案

陶胤运
2023-03-14

使用实际的双精度0.0,而不是0。

葛航
2023-03-14

最简单的修复方法是向构造函数添加零值。类似于这样:

class A<T extends num> {
  final T zero;
  A(this.zero) : assert(zero != null) {        
    var list = List<T>.filled(10, zero);
  }
}
宋建柏
2023-03-14

根据< code>T在运行时绑定的内容,没有简单的表达式可以计算为< code>0或< code>0.0。Dart中表达式的类型是在编译时确定的,在运行前您不知道< code>T的实际类型。

您可以做的是:

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

如果有人设法创建了一个 T

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

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

一般来说,Dart泛型(类型参数)适用于一般处理类型参数类型值的类,这与类型参数是什么无关。这里你要做的是类型专门化,而不是类型泛型,这就是为什么你没有语言支持它。

您最好创建< code>ANum、< code>AInt和< code > ado double 类,然后创建您想要的类,这样您也不必担心< code>A

 类似资料:
  • 问题内容: 我正在尝试重构M类型确实扩展了任何内容的类和子类集,即使我们知道它必须是某种类型的子类也是如此。该类型已参数化,我希望其参数化类型可用于已经具有M值的子类。 有什么方法可以定义此类,而不必在参数列表中包括冗余的K和V泛型类型。我希望能够使编译器从子类映射到的M中推断出它们。 换句话说,我希望类声明看起来像这样: 从M的定义可以推断出K和V的类型。 问题答案: 问题在于,它们并没有真正地

  • 为什么此代码引发此异常: 线程“main”java.lang.ClassCastException:java.lang.Integer无法强制转换为java.lang.Double 而这个,运行良好: 两者都是尝试将整数转换为双精度,对吗?

  • 嗨,我最近看到了一个类似这样的问题 在我回答了这个问题后,事实证明我弄错了,我回答了整数。MIN_VALUE但正确的答案是整数。MAX_VALUE。经过进一步的测试,我意识到我对大于整数的int施加的任何双精度。MAX_VALUE只是使int等于整数。MAX_VALUE。例如 经过进一步的测试,我意识到如果你试图将long转换为int,似乎会将int分配给一个看似随机的数字。 所以我的问题是。到底

  • 我很感激每一个暗示,关于转移目标的文件实现。我已经研究了一些关于浮动精度的论文,但在过去的两周里没有取得太大的进展。 提前感谢!

  • 问题内容: 是否可以为特殊/构造的泛型类型扩展泛型类?我想使用一种方法来扩展Int Arrays,以计算其元素的总和。 例如 问题答案: Swift 5.x:

  • 为什么当我尝试编译以下代码时会收到此错误消息? 或 不兼容的类型:从double到float的可能有损转换 我溢出来了吗?我想了解这背后的理论。提前感谢。