Dart - 参数类型“String”无法分配给参数类型“String”

2023-12-13

我的代码非常简单:

typedef GenericCallback = void Function<T>(T);

void main() {
  GenericCallback callback = <String>(String message) => printMessage(message);
}

void printMessage([String errorMessageReason]) {
  print(errorMessageReason ?? '');
}

DartPad 在这个词上给了我这个错误message in printMessage(message):

错误:参数类型“String/*1*/”无法分配给参数类型“String/*2*/”。
-“String/*1*/”来自“未知”。
- 'String/*2*/' 来自 'dart:core'。

看起来 Dart 正在从一个人那里获取参考String而不是另一个,这怎么可能?


既然你已经做了typedef GenericCallback = void Function<T>(T)您需要提供一个与签名匹配的通用方法作为回调。这里棘手的部分是,你are这样做,但不是按照你想的方式。

在这一行中,您似乎正在尝试指定您创建的闭包的类型:

GenericCallback callback = <String>(String message) => printMessage(message);

然而,Dart 命名泛型类型参数的规则很奇怪,因为您可以使用现有类型的名称作为类型参数的名称。换句话说,以下几行在功能上都是相同的,并且会提供类似的错误:

GenericCallback callback = <String>(String message) => printMessage(message);
GenericCallback callback = <T>(T message) => printMessage(message);
GenericCallback callback = <int>(int message) => printMessage(message);

这些通用闭包都是完全有效的,甚至是内置类型,例如int and String将被视为闭包范围内类型参数的名称。

为了修复您的错误,您需要更改类型参数String拥有不与核心类型冲突的不同名称,并执行以下操作之一:

  • 更新您的调用printMessage铸造message to a String,尽管这会失败,如果T不属于类型String当调用闭包时。
GenericCallback callback = <T>(T message) => printMessage(message as String);
  • 更新你的 typedef 以期望String范围
typedef GenericCallback = void Function<T extends String>(T);

GenericCallback callback = <T extends String>(T message) => printMessage(message);

如果您使用的是允许模板/泛型专业化的语言(例如 C++),那么这是一个很容易犯的错误。请记住,至少目前,您无法专门化泛型方法或对象,并且在实际调用方法或创建对象之前不会分配泛型类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart - 参数类型“String”无法分配给参数类型“String” 的相关文章

随机推荐