Я пытаюсь определить функцию обратного вызова, которая должна принимать универсальный параметр и возвращать значение того же типа. Помните, что следующий пример является упрощенной версией того, что мне действительно нужно.
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
}
Раздражает то, что Дарт действительно понимает, что 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'