既然您已经完成了typedef GenericCallback = void Function<T>(T),您需要提供一个与签名匹配的通用方法作为回调。这里的棘手部分是,您正在这样做,但不是按照您的想法。
在这一行中,您似乎正在尝试为您创建的闭包指定类型:
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 和 String 这样的内置类型也会被视为闭包范围内类型参数的名称。
为了修复您的错误,您需要将类型参数 String 更改为不与核心类型冲突的不同名称,并执行以下操作之一:
- 更新您对
printMessage 的调用,将message 转换为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++)的语言,那么这是一个容易犯的错误。请记住,至少目前,您不能专门化泛型方法或对象,并且在实际调用方法或创建对象之前不会分配泛型类型。