既然你已经做了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 GenericCallback = void Function<T extends String>(T);
GenericCallback callback = <T extends String>(T message) => printMessage(message);
如果您使用的是允许模板/泛型专业化的语言(例如 C++),那么这是一个很容易犯的错误。请记住,至少目前,您无法专门化泛型方法或对象,并且在实际调用方法或创建对象之前不会分配泛型类型。