gpt4 book ai didi

dart - 将泛型类型参数限制为 int、double 或自定义类

转载 作者:行者123 更新时间:2023-12-03 04:11:53 24 4
gpt4 key购买 nike

我尝试制作以下代码,但 T 只能是 int、double 或自定义类。我找不到如何限制 中的类型 Dart 或类似 的东西在哪里 来自 C# .我怎样才能在 Dart 中做到这一点?

class Array3dG<T> extends ListBase<T> {
List<T> l = List<T>();
Array3dG(List<T> list) {
l = list;
}
set length(int newLength) { l.length = newLength; }
int get length => l.length;
T operator [](int index) => l[index];
void operator []=(int index, T value) { l[index] = value; }
}

最佳答案

无法在编译时约束类型变量。类型变量只能有一个界限,并且唯一的界限同时满足 int你的自定义类是Object .

正如@Mattia 所建议的,如果类型参数不是您支持的参数之一,您可以在运行时检查并抛出构造函数:

Array3dG(this.list) { 
if (this is! Array3dG<int> &&
this is! Array3dG<double> &&
this is! Array3dG<MyClass>) {
throw ArgumentError('Unsupported element type $T');
}
}

这可以防止创建错误的实例,但不会在编译时捕获它。

另一种选择是使用工厂方法而不是构造函数:
class Array3dG<T> {
List<T> list;
Array3dG._(this.list);
static Array3dG<int> fromInt(List<int> list) => Array3dG<int>._(list);
static Array3dG<int> fromDouble(List<double> list) => Array3dG<double>._(list);
static Array3dG<MyClass> fromMyClass(List<MyClass> list) => Array3dG<MyClass>._(list);
...
}

然后将其用作 Array3dG.fromInt(listOfInt) .它看起来像一个命名构造函数,但它只是一个静态工厂方法(所以前面没有使用 new)。

关于dart - 将泛型类型参数限制为 int、double 或自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57056244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com