将泛型类型参数限制为int,double或custom类

时间:2019-07-16 11:29:03

标签: dart

我尝试编写以下代码,但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; }
}

2 个答案:

答案 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