【问题标题】:how to specify generic types for a Dart static extension?如何为 Dart 静态扩展指定泛型类型?
【发布时间】:2019-12-19 08:08:35
【问题描述】:

我正在尝试在 Iterable 上创建一个静态扩展,如下所示:


extension IterableExtensions<T> on Iterable<T> {
  Iterable<E> mapIndexed<E, T>(E Function(int index, T item) f) sync* {
    var index = 0;

    for (final item in this) {
      yield f(index, item);
      index = index + 1;
    }
  }
}

但这给了我一个错误: The argument type 'T' can't be assigned to the parameter type 'T'.

而如果我转换编译器很高兴:

extension IterableExtensions on Iterable{
  Iterable<E> mapIndexed<E, T>(E Function(int index, T item) f) sync* {
    var index = 0;

    for (final item in this) {
      yield f(index, item as T);
      index = index + 1;
    }
  }
}

我不确定我在这里做错了什么?

【问题讨论】:

    标签: dart


    【解决方案1】:

    在第一个示例中,您实际上是朝自己的脚开枪。方法签名中定义的T 覆盖了扩展签名中的T。如果将其中一个更改为其他内容,您可以更清楚地看到发生了什么:

    extension IterableExtensions<U> on Iterable<U> {
      Iterable<E> mapIndexed<E, T>(E Function(int index, T item) f) sync* {
        var index = 0;
    
        for (final item in this) {
          yield f(index, item);
          index = index + 1;
        }
      }
    }
    
    // Error: The argument type 'U' can't be assigned to the parameter type 'T'.
    

    解决方法是从方法签名中删除T

    extension IterableExtensions<T> on Iterable<T> {
      Iterable<E> mapIndexed<E>(E Function(int index, T item) f) sync* {
        var index = 0;
    
        for (final item in this) {
          yield f(index, item);
          index = index + 1;
        }
      }
    }
    

    【讨论】:

    • 啊,谢谢!我现在意识到发生了什么:我忘记从方法签名中删除 T 当我将它从一个普通的静态函数转换为一个以 T 作为其第一个参数的扩展时,该参数变成了隐含的“this” .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多