【问题标题】:In flutter source code, why Dart Generics can write code like this?在flutter源码中,为什么Dart Generics能写出这样的代码?
【发布时间】:2019-07-11 09:31:32
【问题描述】:

在 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 不熟悉,谁能告诉我为什么这段代码不会出错?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    这不是“类型安全”,如果您是这样想的话。 他们将child.parentDataParentData 转换为ParentDataType

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

    ContainerRenderObjectMixin 合同的一部分是child.parentDataParentDataType

    【讨论】:

    • Dart 是如何承诺的【它是 ContainerRenderObjectMixin 的合约的一部分,child.parentData 是 ParentDataType.】,你能更具体地描述一下吗?是不是说用ContainerRenderObjectMixin写RenderObject的子类时,子类必须保证child.parentData是ParentDataType?
    • Dart 不保证任何事情。就像你说的,子类必须尊重这一点。
    猜你喜欢
    • 2019-01-28
    • 2022-12-12
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多