【发布时间】:2019-09-14 19:30:22
【问题描述】:
我正在尝试定义一个需要接受泛型参数并返回相同类型值的回调函数。请记住,以下示例是我实际需要的过度简化版本。
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'
【问题讨论】:
标签: generics dart type-parameter dart-2