【问题标题】:Dart runtimeType not returning correct typeDart runtimeType 没有返回正确的类型
【发布时间】:2020-09-11 19:21:01
【问题描述】:
void main() {
  final list = [1].cast<int>();
  print('${list.runtimeType}'); // prints CastList<int, int>
}

当我输入lis... 时,Android Studio 代码完成将类型推断为List&lt;int&gt;,但当我在其上使用runtimeType 时,它会打印CastList&lt;int, int&gt;

这是 IDE 故障还是 Dart 故障?

【问题讨论】:

    标签: android-studio intellij-idea dart


    【解决方案1】:

    cast方法被指定返回一个List:

    List&lt;R&gt; cast &lt;R&gt;()

    这就是您的 IDE 所基于的,因为这是您获得的唯一保证。但是由于其他类可以扩展/实现List,我们也可以返回一个从List扩展的类,并返回基于这种新类型List的对象。

    例如在您的示例中,我们可以看到cast 实际上返回了CastList 的实例。但是由于CastList实现了List的接口,所以cast方法被允许返回CastList实例。

    这就是为什么你不应该真正将runtimeType 用于除调试之外的任何事情的原因之一。 runtimeType 将返回对象的特定类型,而不提供有关已实现接口的任何详细信息。

    如果您想测试给定的类型,您应该使用is 运算符,例如:

    if (obj is List<int>)
    

    is 运算符将测试obj 是否实现了例如List&lt;int&gt; 而不仅仅是测试 obj 是否是从这个特定的类创建的。

    【讨论】:

    • 使用List&lt;int&gt; list;,然后使用list.runtimeType返回List&lt;int&gt;
    • 其次,有时无法使用is,因为我不知道dynamic的变量类型,所以在这种情况下没有任何意义,因为我其实想知道类型。 is 仅在您无法猜测的选项很少时才有用。
    • 我在哪里说过 List 不是 Dart 中实现的类?一个更好的例子是 Map&lt;String, int&gt; map = {'one': 1}; print(map.runtimeType); 将打印 "_InternalLinkedHashMap" 的地图
    • 关于runtimeType 我确实说过你应该只将它用于调试,例如你想看看它是那种类型。但是,当您知道类型时,您应该编写代码以使用 is 来尽可能地进行正确的类型转换和类型检查,以便您可以使用 Dart 类型系统。
    • Where did I say that List is not a class which is implemented in Dart 我什么时候这么说的?在Map 上使用runtimeType,它确实给了你&lt;String, int&gt;,但在我的代码中,一个列表显示你映射类型语法&lt;int, int&gt;
    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    相关资源
    最近更新 更多