我尝试编写以下代码,但T只能是int,double或自定义类。我找不到如何限制 Dart 中的类型或 C#中 where 之类的东西。我该如何在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; }
}
答案 0 :(得分:3)
没有办法在编译时约束类型变量。您只能在类型变量上绑定一个边界,同时满足cat
和您的自定义类的唯一边界是while true; do; ./binary [input] & cat /proc/${!}/maps >> mymaps; done
。
如@Mattia所建议,如果类型参数不是您所支持的参数之一,则可以在运行时检查并抛出构造函数:
int
这可以防止创建错误实例,但在编译时不会捕获该实例。
另一种选择是使用工厂方法而不是构造函数:
Object
,然后将其用作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);
...
}
)。
答案 1 :(得分:1)
您可以在运行时使用java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException
关键字检查类型:
is
请注意,如果您以相同的方式处理Array3dG(List<T> list) {
if (list is List<int>) {
//Handle int
}
else if (list is List<double>) {
//Handle double
}
else if (list is List<MyClass>) {
//Handle MyClass
}
else {
throw ArgumentError('Unsupported $T type');
}
}
和int
,则只需检查double
您可以在此处查看联合类型的进度:https://github.com/dart-lang/sdk/issues/4938