Dart 2 runtimeType和通用泛型-相当于Java Class <T>

时间:2019-06-22 06:55:33

标签: generics dart

我很难理解Dart中的泛型是如何工作的,而文档并没有帮助我。


如果我创建一个名为Checker的类,该类需要以某种方式存储其泛型参数,那么我可以这样做(因为Dart具有reified泛型):

class A {}

class B extends A {}

class Checker<T> {
  bool test(dynamic a) {
    return a is T;
  }
}

main() {
  print(Checker<A>().runtimeType);
  print(Checker<B>().runtimeType);
  print(Checker<String>().runtimeType);

  print(Checker<A>().test(A()));
  print(Checker<A>().test(B()));
  print(Checker<A>().test(""));
}

打印出来的结果与您期望的一样:

Checker<A>
Checker<B>
Checker<String>
true
true
false

这里是问题:

class A {}

class B extends A {}

class Checker<T> {
  bool testChecker<C>(Checker<C> a) {
    return C is T;
  }
}

输出:

false
false
false

看来,两个泛化的泛型不能很好地协同工作。

在Java中,这主要是通过存储Class<T>来解决的,该Type具有isAssignableFrom函数,可以完成所声明的操作。在Dart中,runtimeType只是一个空的抽象类,因此在读取/存储runtimeType时没有用,因为没有函数可以调用它来检查可分配性关系。 (编辑。:_Type返回的所有类都是runtimeType类型,因此它们的任何方法都不能被调用。

如何在Dart中保存 LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.dse_location_list_filter, null); final Dialog dialog = new Dialog(Acitvity_name.this); dialog.setContentView(view); dialog.setCancelable(true); dialog.setCanceledOnTouchOutside(true); dialog.show();

1 个答案:

答案 0 :(得分:0)

如果您将testChecker更改为return a is Checker<T>;,就足够了吗?那将是检查a runtime 类型,而不是呼叫点的静态类型。如果需要后者,可以执行return new Checker<C>() is Checker<T>;

正确的是,永远不要将Type对象用于此类操作,因此.runtimeType毫无用处。

该示例不起作用的原因是它确实return C is T;is运算符的左边是一个对象,右边是一种类型。因此,C被评估为对象,这意味着它评估为类型Type的对象。然后,它检查Type是否是T的子类型,不是。 您不能直接比较类型变量,而必须将对象与类型进行比较。一种选择是执行<C>[] is List<T>-即:检查C (对象)的 ist是否是T 列表>(类型)。 由于我已经有了通用类,因此我只使用Checker<C>() is Checker<T>