【问题标题】:Type inference when using experimental extension methods in the Dart language在 Dart 语言中使用实验性扩展方法时的类型推断
【发布时间】:2019-11-03 12:00:19
【问题描述】:

当我让 Dart 分析下面的例子时……

extension MyList<T> on List<T> {
  List<T> mapToList<T>(T Function(T) convert) => this.map<T>(convert).toList();
}

... dartanalyzer 在转换时报告类型错误,声称“参数类型 'T Function(T)' 不能分配给参数类型 'T Function(T)'.dart(argument_type_not_assignable)”。我想在提交问题之前了解为什么我犯了错误。

【问题讨论】:

    标签: dart types extension-methods type-inference


    【解决方案1】:

    map方法定义为 Iterable&lt;T&gt; map&lt;T&gt;(T f(E e)) =&gt; MappedIterable&lt;E, T&gt;(this, f); 其中 E 是列表的类型,可以与列表的类型不同。 所以你必须做的是:

    extension MyList<E> on List<E> {
      List<T> mapToList<T>(T convert(E e)) => this.map<T>(convert).toList();
    }
    

    【讨论】:

    • 好吧,仍然有两个问题:(1.)映射(通常)发生在一种类型中:map(T f(T e)); (2.) 错误信息“无法将参数类型'T Function(T)'分配给参数类型'T Function(T)”具有误导性。
    • 我认为错误的第一部分The argument type 'T Function(T)'指的是你的函数定义(T Function(T) convert),第二部分can't be assigned to the parameter type 'T Function(T)指的是地图定义(T f(E e))所以他们实际上是不同的泛型类型
    • 问题是你有两个不同的类型变量命名为T,一个被扩展绑定,一个被扩展方法绑定。这就是为什么更改其中之一的名称可以让您编写正确的类型 - 您需要在方法签名中引用扩展类型变量,但类型变量在原始代码中被隐藏了。该消息在技术上是正确的,只是它在不同的地方引用了不同的T。我可能会提出一个问题,要求该消息消除T 名称的歧义,例如T#0T#1 之类的。
    猜你喜欢
    • 2021-10-09
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多