gpt4 book ai didi

dart - 错误 : The name 'E' isn't a type so it can't be used as a type argument, 为什么以及如何创建泛型函数?

转载 作者:行者123 更新时间:2023-12-03 02:45:53 24 4
gpt4 key购买 nike

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

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

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

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

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


void main() {
List<String> strs = mapEnumerated([5, 6, 7],
(i, e) => (i + e).toString()
).toList();

print(strs);
}

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

谁能告诉我实现这个的正确方法是什么?

以下代码有效,但它根本不是通用函数:

Iterable<String> mapEnumerated(Iterable<int> iterable, String Function(int, int) fn) sync* {
var index = 0;
for (final item in iterable) {
yield fn(index++, item);
}
}


void main() {
List<String> strs = mapEnumerated([5, 6, 7],
(i, e) => (i + e).toString()
).toList();

print(strs);
}

非常感谢。

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

最佳答案

类型变量 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);
}
}

这介绍了 E mapEnumerated 上的类型变量函数,因此它可以用于该函数的返回类型。

关于dart - 错误 : The name 'E' isn't a type so it can't be used as a type argument, 为什么以及如何创建泛型函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com