flutter - 在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 谁能告诉我为什么这段代码没有错误?
解决方案
如果这就是您的想法,那不是“类型安全”。他们child.parentData
从ParentData
到铸造ParentDataType
。
但这不会引起问题,因为在该代码的范围内child.parentData
是“保证to be
ParentDataType”。
ContainerRenderObjectMixin
它是合同的child.parentData
一部分ParentDataType
。
推荐阅读
- asp.net-core - 添加分页“IQueryable 未实现 IAsyncQueryProvider”时出现以下错误
- android - 如何从 MultiChoiceModeListener 中的 onItemCheckedStateChanged 到达列表视图中的行项目
- c# - 打破格式和字符串提供到字符串数组列表中
- c++ - 什么时候应该明确属性 noexcept?
- java - javax.ws.rs.ProcessingException,在 Payara Server 5 中找不到内容类型应用程序/json 类型的编写器
- python - @和*与python矩阵乘法有什么区别?
- cordova - 通过输入文件启用相机访问
- flutter - 如何调整 ListView.builder 的大小以适应大型顶部 AppBar?
- unity3d - Unity - 将多边形建模为游戏对象
- firebase - 使用 SwiftUI 从 Cloud Firestore 中的集合“配置文件”中获取数据。无法将类型“[String:Any]”的值分配给类型“UserProfile”