首页 > 解决方案 > 在flutter源码中,为什么Dart Generics能写出这样的代码?

问题描述

在 Flutter 源代码中有一个名为 ContainerRenderObjectMixin 的 Mixin(在 object.dart 文件中),它使用泛型让我感到困惑?像这样:

class ParentData {
  ...
}

abstract class RenderObject {
  ParentData parentData;
  ...
}

mixin ContainerParentDataMixin<ChildType extends RenderObject> on ParentData {
  ...
}

mixin ContainerRenderObjectMixin<ChildType extends RenderObject, ParentDataType extends ContainerParentDataMixin<ChildType>> on RenderObject {
  bool _debugUltimatePreviousSiblingOf(ChildType child, { ChildType equals }) {
    ParentDataType childParentData = child.parentData;
    while (childParentData.previousSibling != null) {
      assert(childParentData.previousSibling != child);
      child = childParentData.previousSibling;
      childParentData = child.parentData;
    }
    return child == equals;
  }
  ...
}

不知道dart怎么确认这个code[ParentDataType childParentData = child.parentData],为什么parentData的Type是ParentDataType?我认为 parentData 的 Type 可以是 ParentData 的任何子类。

我不熟悉 Dart 谁能告诉我为什么这段代码没有错误?

标签: flutterdart

解决方案


如果这就是您的想法,那不是“类型安全”。他们child.parentDataParentData到铸造ParentDataType

但这不会引起问题,因为在该代码的范围内child.parentData是“保证to beParentDataType”。

ContainerRenderObjectMixin它是合同的child.parentData一部分ParentDataType


推荐阅读