在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不熟悉,谁能告诉我为什么此代码不会出错?
答案 0 :(得分:1)
这不是您所想的“类型安全”。
他们正在将child.parentData
从ParentData
投射到ParentDataType
。
但这不会造成问题,因为在该代码范围内child.parentData
被“保证to be
ParentDataType”。
ContainerRenderObjectMixin
是child.parentData
是ParentDataType
合同的一部分。