我有一个关于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的列表吗?
使用实际的双精度0.0,而不是0。
最简单的修复方法是向构造函数添加零值。类似于这样:
class A<T extends num> {
final T zero;
A(this.zero) : assert(zero != null) {
var list = List<T>.filled(10, zero);
}
}
根据< 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的可能有损转换 我溢出来了吗?我想了解这背后的理论。提前感谢。