在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如何确认这段代码[parentdata type child parentdata=child.parentdata],为什么parentdata的类型是parentdatatype?我认为parentdata的类型可以是parentdata的任何子类。
我不熟悉DART,有人能告诉我为什么这个代码没有错误吗?
最佳答案
这不是“类型安全”,如果你是这么想的话。
他们将child.parentData
从ParentData
铸造到ParentDataType
。
但这不会导致问题,因为在代码范围内,“保证”parentdatatype。child.parentData
是合同的一部分。