我试图定义一个回调函数,该函数需要接受一个通用参数并返回相同类型的值。请记住,以下示例是我实际需要的过度简化版本。
final T Function<T>(T value) self = (value) => value
这导致了以下错误,我似乎无法摆脱。
The argument type '(dynamic) → dynamic' can't be assigned to the parameter type '<T>(T) → T'
dart(argument_type_not_assignable)
唯一有效的方法似乎是为值赋予类型,但这违背了首次使用类型参数的初衷。
final T Function<T>(T value) same = <String>(value) => value;
我需要它是通用的,以便调用者可以传递期望返回的类型。我还需要将其存储在变量中,以便我可以将其作为回调函数传递。
如果直接不可能,你知道有什么解决方法吗?提前感谢你。
如果要求不清楚,这里是一个更完整的例子。
abstract class Provider<T> {
T get bar;
}
class StringProvider extends Provider<String> {
String get bar => 'bar';
}
class NumberProvider extends Provider<int> {
int get bar => 42;
}
class Foo {
final T Function<T>(Provider<T> provider) provide;
const Foo({ this.provide });
}
test() {
final foo = Foo(provide: (provider) => provider.bar);
String strValue = foo.provide(StringProvider()); // should be 'bar'
int numValue = foo.provide(NumberProvider()); // should be 42
}
令人烦恼的是,Dart实际上理解
foo.provide(StringProvider())
会返回一个字符串,并且使用NumberProvider
确实会返回一个整数,但是,当变量实际上被赋值时,错误仍然会出现在该行。final foo = Foo(provide: (provider) => provider.bar);
The argument type '(dynamic) → dynamic' can't be assigned to the parameter type '<T>(Provider<T>) → T'
self
是一个顶层变量。 - Alexandre ArdhuinFoo
添加类型参数可以消除错误,但这样做会导致foo.provide
无论传递什么参数都只返回dynamic
。 - skreborn