在颤抖的源代码中,为什么Dart Generics可以编写这样的代码?

时间:2019-07-11 09:31:32

标签: flutter dart

在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;
  }
  ...
}

我不知道飞镖如何确认此代码[ParentDataType childParentData = child.parentData],为什么parentData的类型是ParentDataType?我认为parentData的Type可以是ParentData的任何子类。

我对Dart不熟悉,谁能告诉我为什么此代码不会出错?

1 个答案:

答案 0 :(得分:1)

这不是您所想的“类型安全”。 他们正在将child.parentDataParentData投射到ParentDataType

但这不会造成问题,因为在该代码范围内child.parentData被“保证to be ParentDataType”。

ContainerRenderObjectMixinchild.parentDataParentDataType合同的一部分。