错误:名称“E”不是类型,因此不能用作类型参数。如何创建通用函数?

sgo*_*n00 5 dart

我正在尝试创建一个顶级函数:

\n
Iterable<E> mapEnumerated<T>(Iterable<T> iterable, E Function<E>(int, T) fn) sync* {\n  var index = 0;\n  for (final item in iterable) {\n    yield fn(index++, item);\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,它报告错误消息:The name \'E\' isn\'t a type so it can\'t be used as a type argument.

\n

然后,我尝试将其更改为以下内容,上面的错误消失了,我不知道为什么,但我仍然无法使用它:

\n
Iterable mapEnumerated<T>(Iterable<T> iterable, E Function<E>(int, T) fn) sync* {\n  var index = 0;\n  for (final item in iterable) {\n    yield fn(index++, item);\n  }\n}\n\n\nvoid main() {\n  List<String> strs = mapEnumerated([5, 6, 7], \n    (i, e) => (i + e).toString()\n  ).toList();\n\n  print(strs);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这会报错:The argument type \'(dynamic, dynamic) \xe2\x86\x92 String\' can\'t be assigned to the parameter type \'<E>(int, int) \xe2\x86\x92 E\'

\n

实施这个的正确方法是什么?

\n

以下代码可以工作,但它根本不是通用函数:

\n
Iterable<String> mapEnumerated(Iterable<int> iterable, String Function(int, int) fn) sync* {\n  var index = 0;\n  for (final item in iterable) {\n    yield fn(index++, item);\n  }\n}\n\n\nvoid main() {\n  List<String> strs = mapEnumerated([5, 6, 7], \n    (i, e) => (i + e).toString()\n  ).toList();\n\n  print(strs);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

参考:原始代码来自https://github.com/dart-lang/sdk/issues/32467。我只是不确定如何将其实现为通用函数。

\n

lrn*_*lrn 3

类型变量E仅在参数的函数类型中引入fn,因此在该函数之外不可用。

这里的函数fn被声明为接受通用函数,因此您将无法使用 调用它(i, e) => (i + e).toString),因为该函数本身不是通用的。

您可以将您的函数重写为:

Iterable<E> mapEnumerated<T, E>(Iterable<T> iterable, E Function(int, T) fn) sync* {
  var index = 0;
  for (final item in iterable) {
    yield fn(index++, item);
  }
}
Run Code Online (Sandbox Code Playgroud)

EmapEnumerated函数上引入了类型变量,因此可以在该函数的返回类型中使用它。